fish比zsh好用嗎?

zsh優點是有oh-my-zsh,插件豐富。

fish優點是拆箱即用,囊括了很多zsh + oh-my-zsh的特性,還包括一些oh-my-zsh做不到的特性,雖然有人模仿oh-my-zsh搞了一個oh-my-fish,但是插件太少,從插件上,並不比zsh有優勢。

剛剛發現zsh還有GitHub - unixorn/awesome-zsh-plugins: A collection of ZSH frameworks, plugins themes inspired by the various awesome list collections out there.


對於一個沒有學過並且不需要學習 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 的名字也就逐漸被人們遺忘。


先佔回自己的坑。

自己提的問題,自己在另一個問題當中回答了

https://www.zhihu.com/question/21418449/answer/95753913


fish的腳本功能是個半成品,雖然目的是比bash更規整,但因為不完整,某些功能暫時無法實現或比較繁瑣。


fish最大的問題是與bash不兼容的地方太多了, 導致很多腳本無能正確的運行. 舉個最簡單的例子, fish居然不支持""


好用,但是插件少,最終還是zsh


fish的錯誤提示跟bash不一樣


推薦閱讀:

什麼環境最適合學習 UNIX ?
為什麼提到OS X優勢和Windows劣勢的時候都要大說特說Unix血統?
如何評價王垠的文章《unix的缺陷》?
如何Linux入門?
Unix / 類 Unix shell 中有哪些很酷很冷門很少用很有用的命令?

TAG:Linux | Unix | Shell編程開發 | zsh | Fish腳本語言 |