基礎:機器模型

結束狀態(exit status)

當一個程式結束時,它會留下一則小小的臨別訊息:一個數字,告訴啟動它的人事情順不順利。那個數字就是結束狀態。可以把它想成一名工人在做完工作後,遞回一份只有一個詞的報告——「完成」或「失敗」——好讓老闆(通常是一個 shell 指令稿)不必讀完整段輸出,就知道接下來該怎麼辦。

按長年的慣例,結束狀態為 0 表示成功,任何非零值都表示某種失敗,而不同的數字往往代表不同的問題。在 C 裡,你從 main 回傳的值會成為結束狀態(return 0; 回報成功);程式也能透過呼叫 exit(1) 帶一個狀態提早結束。當行程結束時,作業系統記下這個小整數,而啟動該程式的父行程——一個 shell、一個指令稿、另一個程式——能讀取它,以決定要繼續、重試還是停下。

為何重要:結束狀態是程式之間互相通報成敗的方式,也是 shell 指令稿與自動化的骨幹。像 make && ./run-tests 這樣的一行,只有在 make 的結束狀態為 0 時才會去跑測試。把這件事做對——只在你真的成功時回傳 0、失敗時回傳一個清楚的非零碼——是在 Unix 系統上當個好公民的一部分。這個慣例與日常直覺相反,你也許會以為 1 代表「是/好」;但在這裡,0 才是一切平安,非零才是麻煩。

執行一個命令後,shell 把它的結束狀態存在 $? 裡:$ ./hello; echo $? 會印出 0,因為 hello 確實 return 0;。如果一個程式當掉或回傳 1,你會看到一個非零的數字,而 cmd1 && cmd2 就會跳過 cmd2。

0 表示成功;shell 讀 $? 來得知上一個命令是否成功。

0=成功,與平常「真=1」的習慣相反,常常絆倒人。此外,在 Unix 上只保留狀態的低 8 個位元,所以回傳 256 會環繞成 0、看起來像成功——請把結束碼保持在 0 到 255 的範圍內。

又稱
exit codereturn codeexit valuestatus code離開碼回傳碼