你是不是在設定終端機的時候,看到 Bash、ZSH、Fish 這三個名字,卻搞不清楚它們到底有什麼差別?
不知道自己該選哪一個?
這篇文章會用最簡單的方式,幫你搞懂這三種 Shell 的優缺點和適用場景,看完之後你就能做出最適合自己的選擇。
什麼是 Shell?為什麼要選?
在開始比較之前,先快速解釋一下什麼是 Shell。
首先要分清楚兩個東西:終端機(Terminal) 和 Shell,它們不是同一個東西。
終端機是那個你看得到的視窗程式,像是 macOS 的 Terminal.app、Windows 的 Windows Terminal、或是 iTerm2 這些軟體。
它負責的是「顯示畫面」——字體要多大、背景要什麼顏色、視窗要多寬,這些都是終端機在管的。
Shell 則是在終端機裡面「實際執行指令」的程式。
你打開終端機之後,看到一個可以打字的地方,輸入 cd、ls、git 這些指令,負責讀懂這些指令並且執行它們的,就是 Shell。
簡單來說,終端機是「外殼的畫面」,Shell 是「裡面真正在工作的大腦」。
而且終端機和 Shell 是可以自由搭配的,同一個終端機可以跑不同的 Shell。
所以你不需要換終端機,只要切換 Shell,就能得到完全不同的操作體驗。
而不同的 Shell 有不同的功能、不同的語法,也有不同的使用體驗。
所以選一個適合自己的 Shell,其實會大幅影響你的工作效率。
Bash:最穩定、最通用的老大哥
Bash 到現在依然是大多數 Linux 機器上的預設 Shell。
不管你是用 Ubuntu、CentOS,還是透過 SSH 連到遠端伺服器,預設跑的幾乎都是 Bash。
什麼情況適合用 Bash?
如果你的工作需要經常 SSH 到不同的主機,例如做 DevOps、管理伺服器,那你一定要熟悉 Bash。
因為你不一定能在每台機器上安裝 ZSH 或 Fish,但 Bash 幾乎到處都有。
Bash 的功能夠用嗎?
過去大家覺得 Bash 功能很陽春,沒有自動補全、沒有語法高亮。
但其實現在的 Bash 已經進步很多了,你可以透過安裝額外的套件來獲得類似 ZSH 的功能。
不過這裡有個關鍵差異,要先解釋一個東西:行編輯器(Line Editor)。
行編輯器就是你在終端機裡「打字的那一行」,你輸入指令、按方向鍵移動游標、按 Tab 補全,這些互動都是行編輯器在負責的。
Bash 預設使用的行編輯器叫做 GNU Readline。
問題是,GNU Readline 沒辦法直接擴充來支援語法高亮或自動建議這類功能。
所以如果你想在 Bash 裡面加上這些功能,你不能只是「加一個外掛」,而是要整個替換掉 GNU Readline,換成另一個行編輯器。
ZSH 就不一樣了,ZSH 自己的行編輯器本身就支援擴充。
你想要語法高亮?加一個外掛就好。
想要自動建議?再加一個外掛就好。
不需要把底層的東西換掉,直接在原本的基礎上往上疊加就可以了。
這就是兩者最根本的差異:ZSH 是「擴充」,Bash 是「替換」。
ZSH:功能強大、高度可自訂的進階選擇
ZSH 和 Bash 其實非常相似,但它多了更多功能,也更容易擴充。
ZSH 有哪些好用的功能?
ZSH 可以做到這些事情:
- 自動補全(Auto Complete):輸入指令時,會自動建議你可能要打的內容。
- 語法高亮(Syntax Highlighting):正確的指令會顯示正常顏色,打錯的指令會變紅色,讓你馬上知道哪裡有問題。
- Git 狀態顯示:如果你在一個 Git 專案目錄裡,終端機的提示列會直接顯示目前的分支名稱和狀態。
- 外掛系統(Plugin System):想加什麼功能,裝個外掛就好了。
但是,ZSH 預設長什麼樣?
這裡有一個很多人會搞錯的地方:ZSH 預設的樣子跟 Bash 差不多。
那些漂亮的顏色、Git 資訊、自動補全,通通都不是預設就有的。
你需要自己去設定 .zshrc 這個設定檔,加入各種選項、外掛、主題,才能得到好看又好用的樣子。
不想自己設定怎麼辦?
如果你覺得手動設定太麻煩,有兩個選擇:
第一個是 Oh My ZSH,這是一個非常熱門的 ZSH 設定框架,會幫你預裝一堆外掛和主題。
第二個是 ZSH for Humans,這是一個安裝腳本,會幫你一鍵設定好常用的外掛和功能。
不過如果你想完全掌控自己的終端機環境,還是建議自己手動設定,這樣你會更清楚每一項設定在做什麼。
Fish:開箱即用、對新手最友善的現代 Shell
如果你覺得 ZSH 的設定太麻煩,那 Fish 可能會讓你眼睛一亮。
Fish 最大的優勢:不用設定就很好用
Fish 跟 Bash 和 ZSH 最大的差別就是:安裝完就直接好用。
語法高亮、自動補全、歷史指令搜尋、Tab 補全清單,這些功能通通都是預設就開啟的。
你不需要去改任何設定檔,裝完就可以直接享受。
Fish 的好用功能有哪些?
- 語法高亮:打對的指令顯示正常顏色,打錯的變紅色。
- 自動建議:根據你的歷史紀錄,自動建議你可能要輸入的指令。
- 歷史搜尋:輸入指令的開頭,然後按上下鍵,就可以在歷史紀錄中搜尋以這個開頭的指令。
- Tab 補全:按 Tab 之後會列出所有選項,你可以用方向鍵來選擇。
Bash 和 ZSH 都已經有超過 30 年的歷史了,而 Fish 是比較新的 Shell。
正因為它比較新,所以它的預設設定比較合理、比較現代化。
Fish 的致命缺點:不相容 POSIX 語法
講完優點,接下來要講 Fish 最大的問題:它不是 POSIX 相容的。
什麼是 POSIX?
POSIX 是一套標準規範,定義了 Shell 指令和語法應該長什麼樣子。
Bash 和 ZSH 都遵守這套標準,所以你在 Bash 裡面寫的語法,在 ZSH 裡面也能用。
但 Fish 不遵守這套標準,它有自己的一套語法。
實際的影響是什麼?
舉一個最簡單的例子——設定變數。
在 Bash 或 ZSH 裡面,你會這樣寫:
my_var="hello"
echo $my_var這是 POSIX 標準的寫法,在 Bash 和 ZSH 都能正常執行。
但在 Fish 裡面,這樣寫會直接報錯。
Fish 的寫法是這樣的:
set my_var "hello"
echo $my_var不只是變數,for 迴圈、if 判斷式、甚至連設定別名(alias)的方式在 Fish 裡都不一樣。
那我原本的 Bash 腳本還能用嗎?
好消息是:可以的。
即使你日常使用 Fish,你原本寫好的 Bash 腳本還是能正常執行。
舉個例子,假設你有一個腳本叫 change-volume.sh,用來在調整音量的時候跳出通知:
#!/bin/sh
# 這是一個用 Bash 語法寫的腳本
volume=$(get_current_volume)
notify-send "Volume: $volume%"注意第一行的 #!/bin/sh,這行叫做 Shebang。
Shebang 的作用是告訴系統:「執行這個腳本的時候,請用 /bin/sh(也就是 Bash)來跑,不要用使用者目前的預設 Shell。」
所以即使你的預設 Shell 是 Fish,當你執行這個腳本的時候,系統看到 #!/bin/sh,就會自動切去用 Bash 來跑它。
這之所以行得通,是因為幾乎所有的 Linux 和 macOS 系統都預設安裝了 Bash,/bin/sh 這個路徑在每台機器上都找得到,所以系統一定能順利執行。
這代表你不需要把所有腳本都改寫成 Fish 語法,原本的 Bash 腳本可以繼續用,大部分情況下你也應該繼續用 Bash 來寫腳本。
用 Fish 寫腳本的可攜性問題
你當然也可以選擇用 Fish 的語法來寫腳本,但這樣會帶來可攜性的問題。
但跟 Bash 不一樣的是,Fish 不是系統預裝的 Shell,大部分機器上根本沒有 Fish。
所以如果你用 Fish 的語法寫了一個腳本,那這個腳本就只能在有另外安裝 Fish 的機器上才跑得動。
所以假設你寫了一個很實用的腳本,想分享給朋友用,你的朋友必須自己先去安裝 Fish 才能跑。
但如果你用 Bash 寫的話,幾乎任何一台 Unix 或 Linux 機器都能直接執行,不需要額外安裝任何東西。
這也是為什麼 POSIX 標準會存在——它讓腳本可以在不同的 Unix 系統之間互通。
所以如果你有寫腳本並且分享給別人的需求,用 Fish 語法來寫腳本就不是一個好選擇。
而這也帶出了用 Fish 的一個尷尬之處:你的日常操作和設定檔(config.fish)要用 Fish 的語法來寫,但你的腳本還是用 Bash 的語法在寫,等於同時在用兩套不同的語法。
三種 Shell 的比較總整理
該選哪一個?給不同類型使用者的建議
選 Bash 的情況
如果你需要經常 SSH 到不同的伺服器工作,而且這些伺服器預設都是 Bash,那就直接用 Bash 吧。
把 Bash 練熟,到哪台機器都能馬上上手。
選 ZSH 的情況
如果你想要一個功能強大、高度可自訂,又保持 POSIX 相容的 Shell,那 ZSH 是最好的選擇。
你不需要學新的語法,寫的設定和腳本都跟 Bash 互通,同時又能享受更好的外掛系統和擴充能力。
選 Fish 的情況
如果你不想花時間設定終端機,只想安裝完就直接有好用的體驗,而且你不太需要寫腳本或跟別人分享腳本,那 Fish 會是最省事的選擇。
小結
Bash 是最穩定、最通用的選擇,走到哪都能用。
ZSH 是功能和相容性兼顧的進階選擇,適合願意花時間設定的人。
Fish 是開箱即用的現代選擇,適合不想折騰設定的人,但要注意它的語法跟其他 Shell 不一樣。
沒有哪個 Shell 是「最好的」,只有「最適合你的」。
你可以先試用看看,不喜歡隨時都能換回來,不需要有任何壓力。