
我想知道我們可以使用哪些回傳值,這樣就不會被 ex 誤認為。信號情報?
前任。
$sleep 10
$#hit ctrl+c
$echo $?
130
所以我知道我不能使用類似return 130
或exit 130
所以這會造成誤導:
$function FUNC(){ return 130; };FUNC;echo $?
130
答案1
進程的退出狀態被編碼為一個值0 到 255 之間,這就是您可以用作退出代碼的全部內容。如果傳遞的值超出該範圍,大多數 shell 會使用模 256 的餘數。
退出代碼的唯一規則是0表示成功,任何其他值表示失敗。這個規則超越了unix:它也是其他作業系統(包括DOS、Windows和許多具有退出程式碼概念的嵌入式系統,但VMS的做法不同)上的常見約定。在 UNIX 系統中,它被嵌入到 shell 的布林結構 ( if
, while
, &&
, ||
, !
, set -e
, ...) 中,make
然後是所有標準實用程式。在 POSIX C 程式中,EXIT_SUCCESS
為 0 且EXIT_FAILURE
是某個非零值(通常為 1)。
沒有關於失敗退出代碼選擇的規則(事實上或法律上)。只有少數 POSIX 實用程式強制要求特定的故障狀態碼:
- 如果
!
其運算元傳回 0,shell 運算子將傳回&&
1||
。 cmp
和diff
對於不同的檔案傳回 1,對於錯誤情況傳回 ≥2。expr
如果表達式計算結果為零或 null,則傳回 1;如果表達式無效,則傳回 2;如果其他錯誤,則傳回 ≥3。grep
對於「未找到」傳回 1,對於錯誤情況傳回 ≥2。許多搜尋命令都遵循這一點(但不是find
,如果沒有文件匹配則返回 0)。mesg
回傳 0 表示是,1 表示否,≥2 表示錯誤。patch
如果一個區塊被拒絕,則傳回 1;如果其他錯誤,則傳回 ≥2。sort -c
如果檔案資料未排序,則傳回 1;如果有錯誤,則傳回 ≥2。compress
和localedef
為特定錯誤定義一些小值。
有一個常見但不普遍的觀點,即較大的值意味著更嚴重的失敗。對於測試布林條件的命令,例如grep
(此模式是否存在?)和diff
(這些檔案是否相同?),1 表示“否”,較高的值表示錯誤。此外,126 以上的數值很少使用,因為它們被烘焙到 shell 中(以及 POSIX 命令command
、env
、nice
和nohup
)time
:
- 126和127表示呼叫外部命令失敗;
- 大於 128 的值
$?
表示指令被訊號終止。
/usr/include/sysexits.h
列出了一些值及其含義,但它來自 sendmail,我從未在與電子郵件傳遞無關的程式之外看到過它。
總之,成功回傳 0,失敗回傳 1 或 2。如果您需要區分故障情況,請從 1 開始,並針對更嚴重的故障增加該值。
答案2
退出狀態約定
從技術上講,您可以使用 0 到 255 之間的任何值。
- 退出代碼 1 作為包羅萬象的一般錯誤。
- 退出代碼 64-78 來自sysexits.h來指示錯誤的類別。您通常可以在以下位置找到這些內容/usr/include/sysexits.h,它由 Debian/Ubuntu libc6-dev 軟體包安裝。
- 退出代碼來自錯誤號。您也可以使用以下命令來尋找這些內容錯誤號來自 moreutils 包的命令。在我的系統上,
errno --list
目前運行顯示 134 個定義的錯誤。
文件和顯示
一般來說,最好記錄腳本中使用的退出代碼,或至少記錄您遵循的約定。在退出之前顯示獨特的訊息也可能很有用,例如:
# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64
# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2
答案3
您可以使用 0 到 255 之間的任何數字,除了保留退出代碼(點這裡了解更多)