对于一个没有学过并且不需要学习 bash(或者 Posix shell),而且不喜欢折腾的用户,我感觉 fish 是一个更好的选择。如果他喜欢 fish 的默认配置就更好了,基本可以达到开箱即用的程度。对 bash 语法了解比较少的用户,也可以安装一个尝试一下,如果能接受的话也是不错的。

但对于已经习惯 bash 语法的用户,fish 并不是一个很好的选择。虽然交互使用 fish,脚本使用 bash/zsh,可以解决一部分问题。但使用 fish 带来的问题还是要比它能解决的问题要多。zsh 最主要的问题是配置麻烦,如果使用 oh-my-zsh 的话,最主要的问题从配置麻烦变成了速度慢(自己写 .zshrc 的话,zsh 是绝对不会比 fish 慢的)。我自己用的是一个 200 多行的 .zshrc 脚本(这个脚本只包含 zsh 特有的东西,还有一个 .myshrc 是 bash 和 zsh 通用的东西,接近 500 行),这个脚本是我最初使用 zsh(估计 6 - 7 年前了吧)时在网上收集并且修改的,然后基本就很少再动了。我试过使用 oh-my-zsh 默认配置的启动时间,要比我 .zshrc + .myshrc 两倍还要多,而且功能还是不全的。

已经习惯 bash 语法的用户,我还是建议花一点时间,自己写 .zshrc(其实网上有很多例子,改一下就行了),而不是用 oh-my-zsh 或者其他类似的工具。或者说,如果你想用 oh-my-zsh,那么 fish 可能更适合你。网上可以看到不少人从 zsh 转到 fish,但基本上无一例外是 oh-my-zsh 的用户,而对于自己定制 .zshrc 的用户,fish 基本没有任何吸引力。

fish 相对 zsh 的优势主要就是非常友善的默认配置(但也仅仅是默认配置,如果不满意的话,想定制还是和 zsh 一样得到处搜)。而 zsh 相对 fish 的优势,主要是兼容 bash(其实并不是 100% 的兼容,但一般情况也不会遇到什么大问题)。在命令补全等方面,fish 和 zsh 相比并没有优势,配置好了后的易用性也是(有人说 fish 可以根据 man 补全,首先我不认为这是一个好主意。我不清楚它的具体机制,但基本上有两种方式,一种是每次安装带 man 文档的包后,执行一个后置脚本,这样会拖慢安装速度。另一种是 fish 自己携带 man 文档的补全信息,这样有更新不同步的问题。其次我还没遇到有什么命令需要借助 man 文档补全的,或者说,在用 zsh 的几年里,我基本上从没有过一次认为某个命令应该支持补全而 zsh 没有补全的情况。如果真的遇到了的话,我想我会自己写一个补全脚本然后提交到 zsh-completions)。

因为我并没有将 fish 作为自己默认的 shell 使用,对它的功能和灵活性不是特别了解。也不清楚有没有 zsh 强大和灵活,在这一点就不比较了。但兼容 bash 真的那么重要吗?其实这不只是语法本身的问题,bash 的语法确实有很多问题,最让我头疼的就是和处理带空格的字符串相关的各种问题,而且功能的缺失还是比较多的,从语法上说,我感觉 powershell 的语法更优,而且优势很大,在这一点上 fish 也逊色很多。但至少在目前,很多情况必须使用 bash 语法,因为这早已形成了一个生态环境。我可以假设每个 Linux 机器上都有 bash,可以随意在软件的发布包里使用 bash 脚本,别人也很容易看懂或者修改。但我不能期望别人专门装一个 fish 来执行我的 fish 脚本,当 bash 满足不了需求的时候,我宁愿使用 python,因为在多数机器上,python 也是安装了的。其他开发者也是这么想的,所以我们可以经常看到某个软件包里有 bash 脚本,但很少看到有 fish 脚本(连 zsh 脚本都很少,因为如果不需要使用 zsh 专有的特性,就会使用 bash 脚本,虽然多数情况用 zsh 也能运行)。如果不会 bash 的话,那么出了问题就很难定位和解决。如果我必须要学 bash,那么同时再学一个相差不多的 fish(即使它某些地方更好一些),就没什么必要了。

所以对于真正的重度终端用户,使用 fish 可能会节省一些最初的固定的配置时间,代价是要额外学一门 fish 语言,以及使用的时候面临两种相似的脚本语言的混淆问题,是得不偿失的。

fish 可以取代 zsh 吗?这么多年过去了,zsh 还没有取代 bash,那么 fish 可以取代 zsh 吗?可以这样说,fish 取代 zsh,要比 zsh 取代 bash 还有难很多倍。事实上,fish 目前是非常小众的,甚至和 bash 相比,zsh 都是相对小众的。网上是可以看到很多人用 zsh 或者 fish,但是一个人用 bash 会在网上专门发文章吗?很多人可能都不清楚自己在用的是 bash,还有很多人认为 shell 等同于 bash。

如果从发展上看,我是更看好 zsh 的,至少 zsh 还是有潜力取代 bash 的作为系统唯一的 shell 的(虽然可以还需要一些年),而 fish 基本上只能是一小部分用户使用的交互式 shell,也许不久之后,又会出现一个比 fish 更友好的 shell,而 fish 的名字也就逐渐被人们遗忘。
编辑于 2016-08-24