作为一个大懒人,一直以来都是用macOS自带的bash作为主shell。之前偶然看到了ruanyifeng的Fish shell 入门教程,动了折腾shell的念头。但是尝试了一下fish,感觉太花哨了。后来在Github上发现了这个6万多颗星的oh-my-zsh项目,于是乎就切到了zsh。懒人嘛,就是要跟着人多的项目混。

我们喜欢以90后、或者00后来划分人群。如果把相同的方式用在shell上,那么bash、zsh都是1990年左右诞生的,可以算得上是90后;fish则是00后;更老的bsh、ksh、csh都已经作古,就不谈论了。

00后的fish太酷,一出场就自带配色方案,输入时立马提示补全,炫得不要不要的,而且默认还无法关闭。fish的配置界面就更酷了,直接用Python起了一个Web服务,让你使用浏览器来修改fish的配置。fish的脚本,语法也不是和90后的bash和zsh很兼容。

既然不习惯fish,为啥不继续使用bash呢,既然已经使用很久了?对,没错,从功能上看bash和zsh很像。总的来说zsh还是有那么一点点好处的,至少在交互性上要强一些。bash一开始是要作为bsh的GNU开源替代品,它的目标是成为一个对标准(POSIX标准有对shell进行定义)支持最好,而且向后兼容性最好的shell。所以bash成为了大多数linux发行版的默认设立了。而zsh则不一样,它一开始就是朝着交互性和简单易用的方向前进,顺便也兼顾对标准和向后兼容性的支持。

关于zsh的特性,网上已经有很多资料了,所以我就简单罗列一下zsh吸引我的地方吧:

  • zsh基本上完全支持bash的脚本语法,从bash到zsh无痛切换。
  • macOS上默认的bash版本比较老,所以还是要升级一下的。既然要安装一个新的,何不尝试下新的呢。
  • Tab补全目录的时候不会像bash那样往下刷屏幕,费眼睛还不容你帮你找到目标。zsh的方式比较讨人喜欢,显示出备选的列表,然后使用光标在备选列表切换,比较自然。
  • 在不同的shell窗口共享命令行历史。当你有很多窗口的时候,这个功能特别有用。bash也支持,但我至今还没搞懂怎么配置。
  • 不仅在左边可以显示提示符,在右边也可以显示提示符。平时编辑命令行的时候我喜欢用vi键绑定,右提示符可以同来告诉你vi的不同模式。

更重要的,所有zsh的这些好处,别人都已经替你捣鼓好了。你只需要在zsh里面输入下面这行命令:

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

安装上oh-my-zsh,你的zsh就有了默认的语法高亮和一大堆可用的插件。比如说我想用git和vi-mode插件的话,打开~/.zshrc并编辑:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(
  git
  vi-mode
)

然后重开shell就可以了。git插件增加了对git命令的补全支持,vi-mode把命令行编辑模式切换到vi模式。

对于使用vi-mode的用户,建议绑定以下两个健:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forwar

这样的话,当你输入ls,然后CTRL+P,可以找出你之前所有以ls开头的命令,CTRL+N则用来做CTRL+P之后的回退。

更多阅读

(完)