學習中心/術語一次搞懂·16 分鐘

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 不只是接收指令,它本身就是一種程式語言,這也是為什麼你能把一串操作寫成腳本。

打一行字終端機 Terminal那個視窗。負責顯示文字、接收鍵盤,本身不懂任何指令Shell bash 或 zsh視窗裡實際在聽你講話的程式。它看懂那行字,決定要做什麼指令 ls、grep、curl一個一個獨立的小程式,由 Shell 去把它們叫起來作業系統真正去讀檔案、開網路、改權限的那一層換掉終端機(iTerm、Warp)跟換掉 Shell(bash 換 zsh)是兩件不同的事,很多人以為是同一件。
最常見的誤解是把「黑畫面」當成 bash。黑畫面是終端機,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 分頁看長檔案、headtail 看前幾行後幾行、grep 找含某個字的行、find 找檔案、which 這個指令裝在哪
  • 會移動或改動cd 換資料夾、cp 複製、mv 移動或改名、mkdir 建資料夾、touch 建空檔
  • 會刪除或改權限,要小心rm 刪除、chmod 改權限、chown 改擁有者
  • 跟外面溝通curl 抓網址、ssh 連到另一台機器、git 版本控制

怎麼讀懂別人給你的一行指令

這一段可能是整篇最實用的。你不需要會寫指令,但你應該要能看懂你即將貼上去的那一行在幹嘛

幾乎所有指令都是同一個結構:叫誰、怎麼做、對什麼做。

grep指令-r短選項--color長選項"錯誤"參數一./logs參數二逐段意思grep 指令 要叫哪個程式-r 短選項 單槓+一個字母,可合寫成 -rn--color 長選項 雙槓+完整單字,比較好讀"錯誤" 參數一 要找的字。有空白或中文就加引號./logs 參數二 在哪裡找⚠️ 單槓與雙槓不是隨便選的。-rn 是兩個短選項合寫,--recursive 是一個長選項,寫成 -recursive 多半會錯。
幾乎所有指令都是這個結構:叫誰、怎麼做、對什麼做。看懂結構,陌生指令也猜得出在幹嘛。

管線與重導向:兩個最常見也最少被講清楚的符號

看到 |>>> 不用緊張,它們只是在講「資料要流去哪裡」。

GNU 手冊對管線的定義是:「管線是由控制運算子 | 分隔的一連串指令」,而且「管線中每個指令的輸出,會透過一個 pipe 連到下一個指令的輸入」。白話說就是接力

重導向則是把輸出寫進檔案。這裡有一個一定要知道的差別,而且它是官方規格白紙黑字寫的:> 的時候,如果檔案已經存在,它會被截斷成零位元組。原本的內容直接沒了,不會問你。

管線 | 接給下一個程式cat access.log|grep "500"|wc -l畫面上讀出整份紀錄 → 只留含 500 的行 → 數有幾行。中間不產生任何檔案。重導向 > 與 >> 寫進檔案> 覆蓋官方規格:檔案存在的話,會被截斷成零位元組原本的內容直接沒了,不會問你>> 追加接在檔案後面,原本的留著寫 log 幾乎都用這個一個真的會出事的例子cat a.txt > a.txtShell 會先把 a.txt 清空再開始讀,所以這行會把檔案弄成空的。想加內容請用 >>。
管線是把前一個的輸出接到後一個的輸入。重導向是把輸出寫進檔案。兩個常一起用,但做的事不一樣。

command not found:PATH 是什麼

這大概是新手最常遇到的錯誤訊息,而它的意思常被誤解。

command not found 通常不是「這個東西沒裝」,而是「我不知道要去哪裡找它」。

bash 身上有一個叫 PATH 的環境變數,內容是一串資料夾路徑。你打一個指令,它就照順序去這幾個資料夾裡找同名的程式,找不到就報這個錯。

  • 看目前的 PATHecho $PATH,會印出一串用冒號隔開的路徑
  • 確認某個指令在哪which git。有印出路徑代表找得到,沒有就是不在 PATH 裡
  • 剛裝好卻說找不到:多半是安裝位置沒加進 PATH,或是設定檔改了但沒重開終端機
  • 改設定檔要注意:bash 改 .bashrc.bash_profile,zsh 改 .zshrc。改錯檔案就等於沒改

為什麼 AI 老是給你 bash 指令

因為那是最短、最精確的表達方式。「打開 Finder 找到某個資料夾按右鍵⋯⋯」要寫五行,mv a.txt ~/Desktop/ 一行就完成,而且不會有理解落差。

問題是:你貼上去按 Enter 的那一刻,責任就是你的了。AI 會弄錯路徑、會假設你的環境跟它想的一樣、也會很有自信地給出在你機器上跑不起來的指令。

所以養成貼上前看三件事,花不到十秒:

  • 有沒有 rmsudo>chmod:這四個代表這行會刪東西、用管理員權限、覆蓋檔案、改權限。有的話停下來看懂再貼
  • 路徑對不對:特別注意有沒有出現 / 開頭的絕對路徑,或 ~ 這種指向你整個家目錄的符號
  • 看不懂就問它:直接回一句「這行每一段在做什麼、最壞的情況會怎樣」。這比你自己猜快,也比出事後再問好

會真的出事的六個

這些不是嚇人,是每一個都有人中過。它們的共同點是不會問你第二次

指令做什麼怎麼出事rm -rf 路徑最高遞迴強制刪除,不進垃圾桶、不問你、救不回來路徑打錯或多一個空白就刪錯地方curl 網址 | bash最高把網路上的東西下載下來直接執行你根本沒看過那份內容寫了什麼sudo 任何指令用系統管理員身分執行,繞過所有保護錯誤的影響範圍從你的檔案變成整台電腦指令 > 檔案覆蓋寫入,原內容截斷成零想追加卻寫成覆蓋,資料就沒了chmod 777把權限開到所有人可讀寫執行常被拿來「解決」權限問題,等於把門拆掉* 萬用字元會展開成符合的所有檔名跟 rm 一起用時,展開結果常跟你想的不一樣最實用的一個習慣:刪東西之前,先把 rm 換成 ls 跑一次,看它列出來的是不是你要刪的那些。
這幾個不是不能用,是用之前一定要先看懂。共同點都是「不會問你第二次」。

為什麼 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)

不用背,該記的是什麼

指令有幾千個,沒有人全記得,也不需要。真正要帶走的是這四件事:

  • 分得出「只是看」跟「會改動」。看錯了頂多重看,改錯了可能救不回來
  • 看得懂一行指令的結構:叫誰、怎麼做、對什麼做
  • 知道哪幾個符號代表危險rmsudo>| 接到 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 很常給你指令,你能判斷「這行會不會刪東西、會不會用到管理員權限」,就已經避開絕大多數的意外。真正危險的不是不會,是看不懂卻照貼。

資料來源

每一筆都實際打開確認過。日期是該來源標示的發布日,這類規格會變動, 需要最新狀況請直接看原始出處。

  1. 01
    Bash Reference Manual 1.1 What is Bash?
    GNU 官方手冊·2026-09-22官方一手

    「Bash 是 GNU 作業系統的 shell,也就是命令語言直譯器」與「名字是 Bourne-Again SHell 的縮寫、對 sh 作者 Stephen Bourne 的雙關」這兩句定義。日期為本文查證當日。

  2. 02
    Bash Reference Manual 1.2 What is a shell?
    GNU 官方手冊·2026-09-22官方一手

    「本質上,shell 就是一個執行指令的巨集處理器」、「Unix shell 同時是命令直譯器與一種程式語言」,以及「使用者可以建立包含指令的檔案,這些檔案本身就變成指令,與 /bin 下的系統指令具有相同地位」。本文關於 shell script 的段落出自這裡。日期為本文查證當日。

  3. 03
    Bash Reference Manual 3.2.3 Pipelines 與 3.6 Redirections
    GNU 官方手冊·2026-09-22官方一手

    管線的定義(由控制運算子 | 分隔的一連串指令、每個指令的輸出透過 pipe 連到下一個的輸入),以及重導向章節裡「若檔案已存在,會被截斷成零位元組」這句規格。這是本文強調 > 與 >> 差異的依據。日期為本文查證當日。

  4. 04
    Use zsh as the default shell on Mac
    Apple 官方支援文件·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 直接看到的,任何人都能自行驗證。日期為本文查證當日。

延伸閱讀

想讓整個團隊真的會用 AI?

我把自己經營公司在用的 AI 實戰,做成企業內訓 —— 帶團隊用真實任務當場做出成果。

看企業 AI 內訓