在快速了解Linux/Unix系统中最重要的概念——shell一文中,我们对shell进行了简单的介绍。shell是Linux/Unix的一个外壳,它负责外界(用户)与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。
比如,用 ls 命令列举当前目录的文件,用 find 命令查找文件,用 cp 命令拷贝文件,用 top 命令查看机器负载和进程等。最常见的bash就是shell的一种,也是 Linux下的默认shell程序,这篇主要介绍当下最热门的shell——zsh,相比bash,它更强大,也更人性化,俗称终极shell。
什么是zsh?
对于经常在Linux环境下干活的开发者来说,shell是我们使用最频繁的程序了。而zsh属于shell的一种,和bash 一样,但比bash更好用,zsh完全兼容bash,拥有极其丰富的插件,其强大的自动补全参数、文件名以及自定义功能,可以大大提高我们使用Linux的效率。
安装zsh
Mac OS预装了zsh,可跳过这一步;
Redhat Linux执行: sudo yum install zsh
Ubuntu Linux执行: sudo apt-get install zsh
Windows 请点右上角关闭。。。
安装完成后设置当前用户使用zsh: chsh -s /bin/zsh ,根据提示输入当前用户的密码就可以了。
安装oh-my-zsh
zsh虽然好用,但直接用起来还是比较麻烦,不过幸运的是,已经有大神给我们配置好了一个很棒的框架:oh-my-zsh(github),专门为zsh打造,一条命令搞定安装:
sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
如果 wget 报错,也可手动安装(须先安装git,方法同zsh,替换成git即可):
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
配置
zsh的配置主要集中在用户当前目录的 .zshrc 里,用 vim 或你喜欢的其他编辑器打开 .zshrc ,在最下面会发现这么一行字:
# Customize to your needs…
可以在此处定义自己的环境变量和别名,当然,oh my zsh在安装时已经自动读取当前的环境变量并进行了设置,你可以继续追加其他环境变量。
主题
oh-my-zsh提供了很多主题,主题的配置文件在 ~/.zshrc 文件中可以看到,打开该文件,找到下面这行:
ZSH_THEME="robbyrussel"
这是默认主题,可以将值改为其它任意主题,oh-my-zsh的主题可以在这里找到。改好保存文件后,执行 source ~/.zshrc 使配置生效。当然,你也可以直接将值设置为”random”也是可以的,以后每次登陆服务器,oh-my-zsh会随机选择一个主题,总有一款适合你。
插件
oh my zsh项目提供了完善的插件体系,相关的文件在 ~/.oh-my-zsh/plugins 目录下,默认提供了100多种,大家可以根据自己的实际学习和工作环境采用,想了解每个插件的功能,只要打开相关目录下的zsh文件看一下就知道了。插件也是在 .zshrc 里配置,找到plugins关键字,你就可以加载自己的插件了,系统默认加载git,你可以在后面追加内容,如下:
plugins=(git zsh-syntax-highlighting zsh-autosuggestion autojump z)
优势特色
命令提示
务必明确:命令提示和补全是两个完全不同的系统!很多时候提示比补全更有用,例如:
你才输入完 “tar”命令,后面就用灰色给你提示 tar 命令的参数,而且是随着你动态输入完每一个字母不断修正变化:
比如你输入到 - 后,没有跟着它上面的提示,而是输入了一个z字母,它马上明白你是要解压,不是压缩,然后随即给出你压缩对应的命令提示。
这个命令提示是基于你的历史命令数据库进行分析的,随着你输入的命令越来越多,提示将会越来越准确和顺手,某些不常输入的命令特别管用,比如偶尔查看下网卡配置:
刚输入完:cat /etc/n,它后面已经猜出你可能要查看网卡配置了,然后马上给出你提示,用不着你TAB键补全半天。
如果你觉得它提示的正确,你可以CTRL+F表示采纳,后面就会自动帮你一次性全部输入完了,不用一个字一个字地照着敲。前面的高亮就不说了,用惯这套提示系统,你就再也难以回到光秃秃的bash时代了。
智能补全
缩写路径补全是zsh的一大特色,特别是路径比较长的时候,比如Mac OS下工具链层层套的那种路径,比如某java代码树,有了这种缩写补全,能让你切换路径流畅不少:
当补全内容较多时,不用像bash一样持续提示你需要继续输入,也不会像cmd永无止境的循环下去,连续敲击两次TAB键zsh给你一个补全目录,让你上下左右选择:
这叫选择模式,由两次连续TAB进入,进入后,除了TAB/SHIFT+TAB可以前后切换外,你还可以使用光标键上下左右移动,或者使用emacs键位:CTRL + f/b/p/n (左右上下:forward, backward, previous, next) 。如果你觉得光标键太远难按,CTRL+f/b/p/n太伤小拇指,也可以新定义一套,比如:ALT+hjkl(左下上右)来选择,十分顺手。回车表示确认选择,用CTRL+G表示退出。
命令参数补全更不在话下,输入tar后面按一次TAB:
不仅一级参数可以补全,更常用的是二级参数补全。这时候两次TAB进入选择模式就比较管用了,选择完回车确认,或者CTRL+G退出选择模式。
快速跳转
cd -:切换至最近路径
命令行工作中,不同的路径间切来切去是个头疼的问题,除了上面提到的缩写补全外,也可以使用 cd - 切换到最近跳转过的某个路径:
输入cd后面加一个减号“-”后,按一次TAB马上就列出本次登陆后去过的最近几次路径,接着根据下面的提示输入数字按回车就过去了,比如输入: $ cd -5 <回车> 就跳转到~/.oh-my-zsh/plugins路径下了。当然你还可以不输入数字,而是再按一次tab进入选择模式,上下键或者CTRL+n/p来选择,回车确认,CTRL+G返回。
有了前面的路径缩写展开,和上面的最近访问路径切换,能否更进一步,不限于本次登陆或者最近去过的几级路径,而让我快速进入自开始用zsh之后进入过的某个路径呢?当然可以,我们使用 z 命令,查看历史上进入过的目录。
d:跳转最近历史目录
d 命令会列出我们最近进入的目录历史,并且会给这些目录加上序号,只需要输入对应目录的序号,即可重新进入该目录,如下图所示:
其中序号为1的目录是我的SU目录,直接输入1,立马跳回到SU所在目录。
下一节还会介绍两种跳转类插件z和autojump。
热键绑定
zsh里面使用 bindkey 命令可以设置一系列热键,用来运行某一个zsh内部命令或者某个shell命令。比如从网上下载了一个tar包解开后要稍微浏览一下里面的内容,用的最多的两条命令是啥呢?第一条是 ls 命令,每到一个子目录都要先按一下,还有就是 cd .. 对吧,经过配置:
bindkey -s 'eo' 'cd .. ' # 按下ALT+O 就执行 cd .. 命令 bindkey -s 'e;' 'ls -l ' # 按下 ALT+; 就执行 ls -l 命令
你还可以设置一键打开编辑器,或者一键帮你输入某常用命令的一部分。除了这些命令外,日常命令编写也可以加强一下:
bindkey 'e[1;3D' backward-word # ALT+左键:向后跳一个单词 bindkey 'e[1;3C' forward-word # ALT+右键:前跳一个单词 bindkey 'e[1;3A' beginning-of-line # ALT+上键:跳到行首 bindkey 'e[1;3B' end-of-line # ALT+下键:调到行尾
敲命令时经常需要对已有命令进行修改,默认一个字符一个字符的跳太慢了,这样设置以后基于单词的跳转快速很多,配合其他一些快捷键,修改命令事半功倍。
还不会在自己的终端软件里设置允许ALT键的同学们可以搜索下相关文章。
善用zsh的插件
介绍几款热门常用插件。
zsh-syntax-highlighting:色彩高亮
zsh-syntax-highlighting的主要作用时让你在使用zsh的时候,shell命令可以高亮显示,便捷的知道你输入的命令是否正确。正确的命令会使用绿色渲染,错误的命令会使用红色警告:
安装
Mac OS:直接 brew install zsh-syntax-highlighting ,会自动下载这个插件,再 source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 刷新即可。
对于Oh-my-zsh用户:
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
然后激活这个插件,通过在 ~/.zshrc 中加入插件的名字:
plugins=([plugins...] zsh-syntax-highlighting)
最后当然是source一下,让改变生效: source ~/.zshrc 。
zsh-autosuggestions:命令自动推荐
根据历史输入指令的记录即时的提示,能够很大的提高效率。
安装
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
编辑~/.zshrc文件: plugins=(git zsh-autosuggestions)
z:路径跳转魔术师
强大的目录自动跳转命令,会记忆你曾经进入过的目录,用模糊匹配快速进入你想要的目录。
可以查看历史路径及其权重,跳转至匹配关键字的最高权重路径:
1. 敲入 z 命令,会列出自开始用zsh进入过的目录和它们的权重,进入次数越多,权重越大。
2. 使用 z [key] 直接跳转到所有匹配关键字的历史路径中权重最高的那个。
3. 使用 z -l key 会列出包含关键词的所有历史路径及其权重。关键词可以有多个,使用空格间隔: z -l key1 [key2 ...] 。会先匹配第一个,再匹配第二个,直到最后锁定。
大家实际使用起来,一般是z+最后一级目录名,99%的时候这样做就足够了。当没有按照你要求跳转的时候,你可以再补充再上一级目录的一些信息。实在弄不明白会跳转到哪里,可以随时用上述123的命令查看权重。
安装
直接在 ~/.zshrc 中的插件那行添加z即可: plugins=(git z)
autojump
zsh和autojump的组合形成了zsh下最强悍的插件,实现目录间快速跳转。想去哪个目录直接 autojump dir_name一部分 ,不用再频繁的cd了!
autojump有一个自带的alias:j,因此简单输入 j dir 就可以转到对应的目录去。
对于权重数据库的访问
$ autojump -a [dir] # 在数据库中添加一个目录 $ autojump -i [value] # 提升当前目录value数目的权重 $ autojump -d [value] # 降低当前目录的权重 $ autojump -s # 显示数据库中的统计数据 $ autojump --purge # 清除不再需要的目录
安装
如果你用Mac OS,可以直接brew安装: brew install autojump 。如果是Linux: sudo apt install autojump
修改配置文件: vim ~/.zshrc ,添加: plugins=(git autojump) 。另
# 使用brew安装的 [[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] && . $(brew --prefix)/etc/profile.d/autojump.sh source $ZSH/oh-my-zsh.sh # 使用git安装的 [[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
zsh-incr:自动补全插件
安装
mkdir ~/.oh-my-zsh/plugins/incr wget http://mimosa-pudica.net/src/incr-0.2.zsh -O ~/.oh-my-zsh/plugins/incr/incr.plugin.zsh
在.zshrc文件末尾添加: source ~/.oh-my-zsh/plugins/incr/incr*.zsh
之后 $ source ~/.zshrc 更新配置即可。
(整理自网络)
参考资料:
https://zhuanlan.zhihu.com/p/19556676
https://www.zhihu.com/question/21418449