文章出處

linux在執行完一條命令后,使用 echo $? 會顯示上一條命令是否執行成功,相關狀態碼如下

0為成功

表格 D-1. "保留的"退出碼

退出碼的值含義例子注釋
1 通用錯誤 let "var1 = 1/0" 各種各樣的錯誤都可能使用這個退出碼, 比如"除0錯誤"
2 shell內建命令使用錯誤(Bash文檔上有說明)   很少看到, 通常情況下退出碼都為1
126 命令調用不能執行   程序或命令的權限是不可執行的
127 "command not found"   估計是$PATH不對, 或者是拼寫錯誤
128 exit的參數錯誤 exit 3.14159 exit只能以整數作為參數, 范圍是0 - 255(見腳注)
128+n 信號"n"的致命錯誤 kill -9 腳本的$PPID $? 返回137(128 + 9)
130 用Control-C來結束腳本   Control-C是信號2的致命錯誤, (130 = 128 + 2, 見上邊)
255* 超出范圍的退出狀態 exit -1 exit命令只能夠接受范圍是0 - 255的整數作為參數

通過上面的表, 我們了解到, 退出碼1 - 2, 126 - 165, 和255 [1] 都具有特殊的含義, 因此應該避免使用用戶指定的退出參數. 如果腳本使用exit 127作為退出語句, 那么可能就會在故障診斷的時候產生混淆(如何判斷這是由"command not found"引起的, 還是由用戶定義引起的?). 然而, 許多腳本使用exit 1作為通用的返回錯誤值. 因為退出碼1能夠表示的錯誤太多了, 不過這么做, 對于調試來說, 也起不到任何幫助的作用.

其實早就有人對退出狀態值進行了系統的分類(請參考/usr/include/sysexits.h), 不過這個文件是為C/C++程序員準備的. 其實shell腳本也需要這樣一個類似的標準. 所以本文作者呼吁限制使用用戶定義的退出碼, 尤其是范圍64 - 113(還有0, 表示成功), 這么做, 就可以和C/C++標準保持一致. 這樣我們就有了50個可用的退出碼, 而且非常便于故障診斷.

本書中所有例子中的用戶定義退出碼都符合這個標準, 除了那些超出標準范圍的例子。

 

只有在Bash或sh提示符下, 當shell腳本退出后, 在命令行上使用$?才會得到與上表相一致的結果. 在某些情況下, 運行C-shell或者tcsh可能會給出不同的值.

注意事項

[1]

超出范圍的退出值可能會產生意想不到的退出碼. 如果退出值比255大, 那么退出碼將會取256的模. 舉個例子, exit 3809的退出碼將是225(3809 % 256 = 225).

 

原文


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()