bash 是什麼?看懂別人給你的那行指令
一句話回答
bash 全名 Bourne-Again SHell,是一個程式,負責看懂你在終端機裡打的那行字、再去把對應的工具叫起來。它不是那個黑色視窗(那叫終端機),也不是指令本身。Mac 從 macOS 10.15 起預設已改成 zsh,但兩者日常用法八成相同,網路上教學給的 bash 指令多半照貼可用。
先說結論:bash 是一個程式,不是那個黑畫面
這是最多人搞錯的一件事。黑色視窗叫終端機,bash 是在那個視窗裡聽你講話的程式。兩個可以各自替換:你可以換掉終端機(換成別的視窗程式)而繼續用 bash,也可以在同一個視窗裡把 bash 換成 zsh。
GNU 官方手冊的定義是:「Bash 是 GNU 作業系統的 shell,也就是命令語言直譯器。這個名字是 Bourne-Again SHell 的縮寫」,那是對 sh 作者 Stephen Bourne 的雙關。
如果「終端機」「Shell」「CLI」這幾個詞你還不太確定,先看 CLI 是什麼?跟 GUI 有什麼不同 把名詞對上位置,這篇會直接往下講 bash 本身。
四層關係,一張圖看完
官方對 shell 的定義其實很有意思:「本質上,shell 就是一個執行指令的巨集處理器」,而且「Unix shell 同時是命令直譯器與一種程式語言」。
後半句是重點。bash 不只是接收指令,它本身就是一種程式語言,這也是為什麼你能把一串操作寫成腳本。
為什麼 Mac 現在預設是 zsh 不是 bash
Apple 官方的說法很簡單一句:「從 macOS 10.15 起,你的 Mac 使用 zsh 作為預設的登入 shell 與互動 shell」。在那之前的 macOS 10.14 與更早,預設是 bash。
Apple 沒有說明改用 zsh 的原因,網路上有各種推測,我就不轉述沒有出處的說法。但有一件事你自己打一行就能驗證,而且影響更實際:
在 Mac 上打 bash --version,你會看到版本是 3.2.57,而且下一行寫著 Copyright (C) 2007。也就是說,macOS 內建的 bash 停在 2007 年的版本,而 bash 這些年已經出到 5.x。
這件事什麼時候會咬你:AI 或網路教學給你的指令可能用到新版 bash 的語法,在 Mac 內建的 bash 上會失敗。 遇到「明明照抄卻說語法錯誤」,這是其中一個原因。真的需要新版就用套件管理工具另外裝一份,系統內建那份不要動。
bash 跟 zsh 差在哪,會影響我嗎
對絕大多數人來說:不影響。日常的 cd、ls、複製貼上別人給的指令,兩邊行為幾乎一樣。
會有差別的地方通常是這幾種,知道有這回事就好:
- 設定檔不同:bash 讀
.bashrc與.bash_profile,zsh 讀.zshrc。照教學改了設定卻沒生效,八成是改錯檔案 - 提示字元與自動補全:zsh 的補全比較聰明,很多人裝了主題之後畫面長得不一樣,但那是外觀不是能力
- 腳本開頭那行:
.sh檔第一行寫#!/bin/bash就一定用 bash 跑,跟你平常用哪個 shell 無關 - 少數語法細節:陣列、萬用字元展開的行為有些微差異。寫長腳本才會碰到
你一定會遇到的那些指令
不用背,看過有印象就好。真正要記的是它們各自會不會改動東西。
- 只是看,不會改:
pwd我現在在哪、ls列出檔案、cat印出檔案內容、less分頁看長檔案、head與tail看前幾行後幾行、grep找含某個字的行、find找檔案、which這個指令裝在哪 - 會移動或改動:
cd換資料夾、cp複製、mv移動或改名、mkdir建資料夾、touch建空檔 - 會刪除或改權限,要小心:
rm刪除、chmod改權限、chown改擁有者 - 跟外面溝通:
curl抓網址、ssh連到另一台機器、git版本控制
怎麼讀懂別人給你的一行指令
這一段可能是整篇最實用的。你不需要會寫指令,但你應該要能看懂你即將貼上去的那一行在幹嘛。
幾乎所有指令都是同一個結構:叫誰、怎麼做、對什麼做。
管線與重導向:兩個最常見也最少被講清楚的符號
看到 |、>、>> 不用緊張,它們只是在講「資料要流去哪裡」。
GNU 手冊對管線的定義是:「管線是由控制運算子 | 分隔的一連串指令」,而且「管線中每個指令的輸出,會透過一個 pipe 連到下一個指令的輸入」。白話說就是接力。
重導向則是把輸出寫進檔案。這裡有一個一定要知道的差別,而且它是官方規格白紙黑字寫的:用 > 的時候,如果檔案已經存在,它會被截斷成零位元組。原本的內容直接沒了,不會問你。
command not found:PATH 是什麼
這大概是新手最常遇到的錯誤訊息,而它的意思常被誤解。
command not found 通常不是「這個東西沒裝」,而是「我不知道要去哪裡找它」。
bash 身上有一個叫 PATH 的環境變數,內容是一串資料夾路徑。你打一個指令,它就照順序去這幾個資料夾裡找同名的程式,找不到就報這個錯。
- 看目前的 PATH:
echo $PATH,會印出一串用冒號隔開的路徑 - 確認某個指令在哪:
which git。有印出路徑代表找得到,沒有就是不在 PATH 裡 - 剛裝好卻說找不到:多半是安裝位置沒加進 PATH,或是設定檔改了但沒重開終端機
- 改設定檔要注意:bash 改
.bashrc/.bash_profile,zsh 改.zshrc。改錯檔案就等於沒改
為什麼 AI 老是給你 bash 指令
因為那是最短、最精確的表達方式。「打開 Finder 找到某個資料夾按右鍵⋯⋯」要寫五行,mv a.txt ~/Desktop/ 一行就完成,而且不會有理解落差。
問題是:你貼上去按 Enter 的那一刻,責任就是你的了。AI 會弄錯路徑、會假設你的環境跟它想的一樣、也會很有自信地給出在你機器上跑不起來的指令。
所以養成貼上前看三件事,花不到十秒:
- 有沒有
rm、sudo、>、chmod:這四個代表這行會刪東西、用管理員權限、覆蓋檔案、改權限。有的話停下來看懂再貼 - 路徑對不對:特別注意有沒有出現
/開頭的絕對路徑,或~這種指向你整個家目錄的符號 - 看不懂就問它:直接回一句「這行每一段在做什麼、最壞的情況會怎樣」。這比你自己猜快,也比出事後再問好
會真的出事的六個
這些不是嚇人,是每一個都有人中過。它們的共同點是不會問你第二次。
為什麼 curl 網址 | bash 特別危險
這個寫法在安裝教學裡非常常見,所以值得單獨講。
它的意思是:從網路上抓一份腳本下來,直接餵給 bash 執行,中間你完全沒看過內容。等於別人傳一個 .exe 給你,你連檔名都沒看就雙擊。
而且它比下載執行更難防:你當下看到的網址內容,跟明天的可能不一樣。對方被入侵、或單純換了檔案,你的指令照樣會執行新的版本。
比較安全的做法是拆成兩步:先 curl 網址 -o install.sh 把它存下來,用 cat install.sh 或編輯器看過,確認沒問題再 bash install.sh。多花三十秒,但你知道自己執行了什麼。
Shell script:把重複的事寫成一個檔
當你發現同一串指令每週都要打一次,就可以把它們存成一個 .sh 檔。這就是 shell script。
官方手冊講得很直白:「使用者可以建立包含指令的檔案,這些檔案本身就變成指令」,而且「與 /bin 這類目錄下的系統指令具有相同地位」。
最小的樣子就三行:第一行宣告要用哪個 shell 跑,下面就是你平常會打的那些指令。存檔之後用 chmod +x 檔名 給它執行權限,之後就能直接叫它。
不用一開始就追求寫得漂亮。把你已經在做的事原封不動抄進去,就已經有價值了,因為它至少不會再打錯字。
新手最常卡住的五件事
這幾個一講就懂,但沒人講的話可以卡你半小時:
- 路徑有空白要加引號:
cd My Documents會被當成兩個參數。要寫cd "My Documents" - 相對路徑與絕對路徑:
/Users/你/專案是絕對的,從哪裡打都一樣。./專案是相對的,要看你現在站在哪。搞不清楚就先pwd看一下 ~是你的家目錄:所以rm -rf ~/這種東西看起來只有幾個字,實際指的是你所有的檔案- Tab 鍵會自動補完:打一半按 Tab,路徑跟檔名它會幫你補。這不只是快,更是避免打錯字最有效的方法
- Ctrl+C 是中斷,不是複製:在終端機裡 Ctrl+C 會把正在跑的東西停掉。複製要用 Cmd+C(Mac)
不用背,該記的是什麼
指令有幾千個,沒有人全記得,也不需要。真正要帶走的是這四件事:
- 分得出「只是看」跟「會改動」。看錯了頂多重看,改錯了可能救不回來
- 看得懂一行指令的結構:叫誰、怎麼做、對什麼做
- 知道哪幾個符號代表危險:
rm、sudo、>、|接到 bash - 不確定就問,而不是先貼再說。這一條比前面三條加起來都重要
常見問題
bash 跟終端機是同一個東西嗎?
不是。終端機是那個視窗程式,負責顯示文字與接收鍵盤,bash 則是在視窗裡實際看懂你指令的程式。兩者可以各自替換,你可以換掉視窗程式而繼續用 bash,也可以在同一個視窗裡把 bash 換成 zsh。
我的 Mac 是 zsh,網路上的 bash 教學還能照用嗎?
日常操作幾乎都可以。cd、ls、複製貼上指令這些兩邊行為一樣。會有差別的主要是設定檔名稱(.bashrc 對 .zshrc)以及少數進階語法。真的要用 bash 跑,可以在腳本第一行寫 #!/bin/bash,那樣就跟你平常用哪個 shell 無關了。
為什麼 Mac 上的 bash 版本那麼舊?
打 bash --version 會看到 3.2.57、Copyright 2007。macOS 內建那份確實停在 2007 年的版本,而 bash 已經出到 5.x。Apple 官方沒有說明原因。實務上的影響是:新版語法在系統內建的 bash 上可能失敗,需要的話用套件管理工具另外裝一份,不要動系統那份。
大於符號 > 跟兩個大於 >> 差在哪?
> 是覆蓋,>> 是追加。差別很致命:官方規格寫明用 > 的時候,如果檔案已經存在會被截斷成零位元組,原本的內容直接沒了而且不會問你。想在檔案後面加東西一律用 >>。
command not found 是代表我沒裝那個東西嗎?
不一定。多數時候是「裝了但找不到」。bash 靠 PATH 這個環境變數決定去哪些資料夾找程式,沒加進去就找不到。先用 which 指令名 確認,再看是不是設定檔改錯(bash 改 .bashrc,zsh 改 .zshrc)或改完沒重開終端機。
AI 給我的指令,我可以直接貼上去跑嗎?
貼之前花十秒看三件事。一、有沒有 rm、sudo、>、chmod。二、路徑對不對,特別是 / 開頭的絕對路徑跟 ~。三、看不懂就直接問它「這行每一段在做什麼、最壞會怎樣」。按下 Enter 的那一刻責任就是你的,AI 不會替你承擔。
安裝教學叫我跑 curl 網址 | bash,可以嗎?
能避就避。那等於從網路抓一份程式直接執行,你完全沒看過內容,而且今天看到的版本跟明天的可能不一樣。拆成兩步比較安全:先 curl 網址 -o install.sh 存下來,看過再 bash install.sh。多三十秒,但你知道自己執行了什麼。
我完全不會寫程式,有必要學 bash 嗎?
不用學到會寫,但建議學到看得懂。現在 AI 很常給你指令,你能判斷「這行會不會刪東西、會不會用到管理員權限」,就已經避開絕大多數的意外。真正危險的不是不會,是看不懂卻照貼。
資料來源
每一筆都實際打開確認過。日期是該來源標示的發布日,這類規格會變動, 需要最新狀況請直接看原始出處。
- 01Bash Reference Manual 1.1 What is Bash?GNU 官方手冊·2026-09-22官方一手
「Bash 是 GNU 作業系統的 shell,也就是命令語言直譯器」與「名字是 Bourne-Again SHell 的縮寫、對 sh 作者 Stephen Bourne 的雙關」這兩句定義。日期為本文查證當日。
- 02Bash Reference Manual 1.2 What is a shell?GNU 官方手冊·2026-09-22官方一手
「本質上,shell 就是一個執行指令的巨集處理器」、「Unix shell 同時是命令直譯器與一種程式語言」,以及「使用者可以建立包含指令的檔案,這些檔案本身就變成指令,與 /bin 下的系統指令具有相同地位」。本文關於 shell script 的段落出自這裡。日期為本文查證當日。
- 03Bash Reference Manual 3.2.3 Pipelines 與 3.6 RedirectionsGNU 官方手冊·2026-09-22官方一手
管線的定義(由控制運算子 | 分隔的一連串指令、每個指令的輸出透過 pipe 連到下一個的輸入),以及重導向章節裡「若檔案已存在,會被截斷成零位元組」這句規格。這是本文強調 > 與 >> 差異的依據。日期為本文查證當日。
- 04Use zsh as the default shell on MacApple 官方支援文件·2026-09-22官方一手
「從 macOS 10.15 起,你的 Mac 使用 zsh 作為預設的登入 shell 與互動 shell」,以及 macOS 10.14 與更早預設為 bash。⚠️ 該頁並未說明改用 zsh 的原因,也沒有提到內建 bash 的版本,所以本文沒有轉述任何關於授權條款的推測。文中 bash 3.2.57 與 Copyright 2007 這兩個數字,是在 macOS 上執行 bash --version 直接看到的,任何人都能自行驗證。日期為本文查證當日。