Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Bash vs ZSH vs Fish:三大終端機 Shell 到底差在哪?新手選哪個好?

最後更新:2026年4月14日基礎概念

你是不是在設定終端機的時候,看到 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 的比較總整理

比較項目BashZSHFish
預設安裝幾乎所有 Linux 都有macOS 預設,Linux 需安裝需要另外安裝
開箱即用陽春陽春(需要設定)非常好用
自動補全需要額外設定需要外掛預設就有
語法高亮需要額外工具需要外掛預設就有
外掛生態較少豐富還不錯
可自訂程度中等非常高中等
POSIX 相容是是否
適合寫腳本分享最適合適合不適合
學習成本低中等低(但語法不同)
Bash幾乎所有 Linux 都有
ZSHmacOS 預設,Linux 需安裝
Fish需要另外安裝
Bash陽春
ZSH陽春(需要設定)
Fish非常好用
Bash需要額外設定
ZSH需要外掛
Fish預設就有
Bash需要額外工具
ZSH需要外掛
Fish預設就有
Bash較少
ZSH豐富
Fish還不錯
Bash中等
ZSH非常高
Fish中等
Bash是
ZSH是
Fish否
Bash最適合
ZSH適合
Fish不適合
Bash低
ZSH中等
Fish低(但語法不同)

該選哪一個?給不同類型使用者的建議

選 Bash 的情況

如果你需要經常 SSH 到不同的伺服器工作,而且這些伺服器預設都是 Bash,那就直接用 Bash 吧。

把 Bash 練熟,到哪台機器都能馬上上手。

選 ZSH 的情況

如果你想要一個功能強大、高度可自訂,又保持 POSIX 相容的 Shell,那 ZSH 是最好的選擇。

你不需要學新的語法,寫的設定和腳本都跟 Bash 互通,同時又能享受更好的外掛系統和擴充能力。

選 Fish 的情況

如果你不想花時間設定終端機,只想安裝完就直接有好用的體驗,而且你不太需要寫腳本或跟別人分享腳本,那 Fish 會是最省事的選擇。

小結

Bash 是最穩定、最通用的選擇,走到哪都能用。

ZSH 是功能和相容性兼顧的進階選擇,適合願意花時間設定的人。

Fish 是開箱即用的現代選擇,適合不想折騰設定的人,但要注意它的語法跟其他 Shell 不一樣。

沒有哪個 Shell 是「最好的」,只有「最適合你的」。

你可以先試用看看,不喜歡隨時都能換回來,不需要有任何壓力。

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

基礎概念

目錄

  • 什麼是 Shell?為什麼要選?
  • Bash:最穩定、最通用的老大哥
  • 什麼情況適合用 Bash?
  • Bash 的功能夠用嗎?
  • ZSH:功能強大、高度可自訂的進階選擇
  • ZSH 有哪些好用的功能?
  • 但是,ZSH 預設長什麼樣?
  • 不想自己設定怎麼辦?
  • Fish:開箱即用、對新手最友善的現代 Shell
  • Fish 最大的優勢:不用設定就很好用
  • Fish 的好用功能有哪些?
  • Fish 的致命缺點:不相容 POSIX 語法
  • 什麼是 POSIX?
  • 實際的影響是什麼?
  • 那我原本的 Bash 腳本還能用嗎?
  • 用 Fish 寫腳本的可攜性問題
  • 三種 Shell 的比較總整理
  • 該選哪一個?給不同類型使用者的建議
  • 選 Bash 的情況
  • 選 ZSH 的情況
  • 選 Fish 的情況
  • 小結