Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

大多数的Linux用户偏爱Bash,因为发行版通常默认的就是它。

Bash确实是不错的Shell,但仍有用很多不尽人意的地方,如自动补全的功能不够强大,定位较长路径不够方便,命令历史管理不够完善等。

介绍使用zsh,功能十分强大..推荐给大家!

1、zsh介绍

1.1 Linux shell

Linux/Unix提供了很多种Shell,为毛要这么多Shell?

难道用来炒着吃么?那我问你,你同类型的衣服怎么有那么多件?花色,质地还不一样。写程序比买衣服复杂多了,而且程序员往往负责把复杂的事情搞简单,简单的事情搞复杂。牛程序员看到不爽的Shell,就会自己重新写一套,慢慢形成了一些标准,常用的Shell有这么几种,sh、bash、csh等,想知道你的系统有几种shell,可以通过以下命令查看:

cat /etc/shells

显示如下:

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

1.2 zsh简介

Zsh是一个Linux下强大的shell, 由于大多数Linux产品安装,以及默认使用bash shell, 但是丝毫不影响极客们对zsh的热衷, 几乎每一款Linux产品都包含有zsh,通常可以用apt-get、urpmi或yum等包管理器进行安装

Zsh具有以下主要功能

  • 开箱即用、可编程的命令行补全功能可以帮助用户输入各种参数以及选项
  • 在用户启动的所有shell中共享命令历史
  • 通过扩展的文件通配符,可以不利用外部命令达到find命令一般展开文件名
  • 改进的变量与数组处理
  • 在缓冲区中编辑多行命令
  • 多种兼容模式,例如使用/bin/sh运行时可以伪装成Bourne shell
  • 可以定制呈现形式的提示符;包括在屏幕右端显示信息,并在键入长命令时自动隐藏
  • 可加载的模块,提供其他各种支持:完整的TCP与Unix域套接字控制,FTP客户端与扩充过的数学函数
  • 完全可定制化

1.3 zsh与oh-my-zsh终极配置

不熟悉 Zsh 的人,对 Zsh 最深刻的印象应该就是它的命令提示符了。它支持右侧对齐的提示符,并且可以配置成这个样子的:

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

zsh 的自动补全功能十分的强大,如图所示:

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

它可以自动补全命令、参数、文件名、进程、用户名、变量、权限符等。

Zsh 还有一个贴心的功能:路径别名。假设有一个很长的路径,例如 /home/lighttpd/html,可以把这个路径命名为 ~WWW。

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

Zsh 可以使用 Emacs 风格的键绑定,习惯 Bash 键绑定的朋友无需重新适应。Zsh 兼容大多数主流 Shell,像 Bash、Csh 等。

错误校正

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

-- directory -- 是补全类型提示

/etc/x11 [tab] 后被修正为 /etc/X11

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

全类型提示变成了 -- corrections --

请注意,这个功能不是单纯的修正大小写,而是各种拼写错误 比如说上面的例子,如果输入的是 11 或者 s11,它一样会修正为 X11

有一个前提,就是每次修正,只允许有一处字符错误 两个以上的错误,除非可以匹配其它的选项,否则就不能修正 12 就不能修正为 X11 ,除非候选里有 X12、Y12、Z12……

在配置文件里找到这一行,修改容错字数

<code>zstyle ':completion:*:approximate:*' max-errors 1 numeric
/<code>

当然可以把容错字数改大一些,不过太大了也没有意义了 随便输点什么,就可以匹配所有的,和没有一样

强大的重定向功能

同时重定向 stdout 和 stderr 到 file: command |& >file 同时重定向到多个文件: command >file.1 >file.2

比如装系统的时候,可以用这个命令

<code>blkid >> /boot/grub/menu.lst >> /etc/fstab
/<code>

补全类型控制

例如:

<code>compctl -g '*.tar.gz *.gz*.tgz' + -g '*(-/)' tar zxvf
/<code>

过滤候选项

tar zxvf [tab] 候选菜单中只出现扩展名为 .tar.gz .gz .tgz 的文件

不过这个功能比较复杂,容易引起混乱,通常需要脚本配合

<code>compctl -g '*.tar.bz2 *.tar.gz *.bz2 *.gz *.jar *.rar *.tar *.tbz2 *.tgz *.zip *.Z' + -g '*(-/)' extractextract() {  
   if [[ -z "$1" ]] ; then
       print -P "usage: \\\\e[1;36mextract\\\\e[1;0m < filename >"
       print -P "       Extract the file specified based on the extension"
   elif [[ -f $1 ]] ; then
       case ${(L)1} in
           *.tar.bz2)  tar -jxvf $1    ;;
           *.tar.gz)   tar -zxvf $1    ;;
           *.bz2)      bunzip2 $1       ;;
           *.gz)       gunzip $1       ;;
           *.jar)      unzip $1       ;;
           *.rar)      unrar x $1       ;;
           *.tar)      tar -xvf $1       ;;
           *.tbz2)     tar -jxvf $1    ;;
           *.tgz)      tar -zxvf $1    ;;
           *.zip)      unzip $1          ;;
           *.Z)        uncompress $1    ;;
           *)          echo "Unable to extract '$1' :: Unknown extension"
       esac
   else
       echo "File ('$1') does not exist!"
   fi
}
/<code>

考虑到使用的不多,配置又麻烦,我没有配置这个功能,不过我想肯定有人愿意在这上面花点时间

将 Zsh 设置为默认 Shell(不建议更改 root 用户的默认 shell)

<code>usermod -s /usr/local/bin/zsh/<code>

2、安装zsh

2.1 安装zsh

对于一般的Ubuntu系统,配置好正确的源之后,就能直接键入以下命令安装:

<code>sudo apt-get install zsh/<code>

2.2 取代bash,设为默认shell

<code>sudo usermod -s /bin/zsh username/<code>

或者

<code>chsh -s /bin/zsh
chsh -s `which zsh`/<code>

如果要切换回去bash:

<code>chsh -s /bin/bash/<code>

当然你实在不愿意把zsh当成默认的shell, 而又想使用它, 那么你可以每次进入是都使用zsh进入, 而输入exit退出

Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

2.3 安装oh-my-zsh

直接用zsh会很蛋疼,因为zsh功能很强大但是太复杂,所以需要oh-my-zsh来将它简单化

直接用git从github上面下载包

<code>git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh/<code>

备份已有的zshrc, 替换zshrc

<code>cp ~/.zshrc ~/.zshrc.origcp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc/<code>

直接使用脚本安装

<code>cd oh-my-zsh/tools
./install.sh/<code>

你可以直接直接使用如下命令安装

curl

<code>sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"/<code>

wget

<code>sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"/<code>

其本质就是下载并执行了github上的install.sh脚本, 该脚本位于oh-my-zsh/tools/install.sh

配置主题

oh-my-zsh集成了大量的主题, 位于oh-my-zsh/theme

配置主题, 可以通过修改~/.zshrc中的环境变量ZSH_THEME来完成

<code>ZSH_THEME="agnoster" # (this is one of the fancy ones)/<code>

如果你觉得主题太多你可以选择使用随机模式, 来由系统随机选择

<code>ZSH_THEME="random" # (...please let it be pie... please be some pie..)/<code>
Linux终极shell-Z Shell——用强大的zsh&oh-my-zsh把Bash换掉

配置插件

修改~/.zshrc中plugins

<code>plugins=(git bundler osx rake ruby)/<code>

更新oh-my-zsh

默认情况下, 您将被提示检查每几周的升级. 如果你想我ZSH自动升级本身没有提示你, 修改`~/.zshrc

<code>disable_update_prompt = true/<code>

禁用自动升级, 修改~/.zshrc

<code>disable_auto_update = true/<code>

当然你也可以选择手动更新

如果你想在任何时间点升级(也许有人刚刚发布了一个新的插件,你不想等待一个星期?)你只需要运行:

<code>upgrade_oh_my_zsh/<code>

卸载oh-my-zsh

如果你想卸载oh-my-zsh, 只需要执行uninstall_oh_my_zsh zsh, 从命令行运行. 这将删除本身和恢复你以前的bash或者zsh配置.

<code>uninstall_oh_my_zsh zsh/<code>

此外, 更多任性的功能, 速度来感受吧

  1. 兼容 bash,原来使用 bash 的兄弟切换过来毫无压力,该咋用咋用。
  2. 强大的历史纪录功能,输入 grep 然后用上下箭头可以翻阅你执行的所有 grep 命令。
  3. 智能拼写纠正,输入gtep mactalk * -R,系统会提示:zsh: correct ‘gtep’ to ‘grep’ [nyae]? 比妹纸贴心吧,她们向来都是让你猜的……
  4. 各种补全:路径补全、命令补全,命令参数补全,插件内容补全等等。触发补全只需要按一下或两下 tab 键,补全项可以使用 ctrl+n/p/f/b上下左右切换。比如你想杀掉 java 的进程,只需要输入 kill java + tab键,如果只有一个 java 进程,zsh 会自动替换为进程的 pid,如果有多个则会出现选择项供你选择。ssh + 空格 + 两个tab键,zsh会列出所有访问过的主机和用户名进行补全
  5. 智能跳转,安装了autojump之后,zsh 会自动记录你访问过的目录,通过 j + 目录名 可以直接进行目录跳转,而且目录名支持模糊匹配和自动补全,例如你访问过hadoop-1.0.0目录,输入j hado 即可正确跳转。j –stat 可以看你的历史路径库。
  6. 目录浏览和跳转:输入 d,即可列出你在这个会话里访问的目录列表,输入列表前的序号,即可直接跳转。
  7. 在当前目录下输入 .. 或 … ,或直接输入当前目录名都可以跳转,你甚至不再需要输入 cd 命令了。
  8. 通配符搜索:ls -l */.sh,可以递归显示当前目录下的 shell 文件,文件少时可以代替 find,文件太多就歇菜了。
  9. 更强的别名
  10. 插件支持

需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享


分享到:


相關文章: