我可以在 bash 函數/腳本中使用哪些返回/退出值?

我可以在 bash 函數/腳本中使用哪些返回/退出值?

我想知道我們可以使用哪些回傳值,這樣就不會被 ex 誤認為。信號情報?

前任。

$sleep 10
$#hit ctrl+c
$echo $?
130

所以我知道我不能使用類似return 130exit 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 ||
  • cmpdiff對於不同的檔案傳回 1,對於錯誤情況傳回 ≥2。
  • expr如果表達式計算結果為零或 null,則傳回 1;如果表達式無效,則傳回 2;如果其他錯誤,則傳回 ≥3。
  • grep對於「未找到」傳回 1,對於錯誤情況傳回 ≥2。許多搜尋命令都遵循這一點(但不是find,如果沒有文件匹配則返回 0)。
  • mesg回傳 0 表示是,1 表示否,≥2 表示錯誤。
  • patch如果一個區塊被拒絕,則傳回 1;如果其他錯誤,則傳回 ≥2。
  • sort -c如果檔案資料未排序,則傳回 1;如果有錯誤,則傳回 ≥2。
  • compresslocaledef為特定錯誤定義一些小值。

有一個常見但不普遍的觀點,即較大的值意味著更嚴重的失敗。對於測試布林條件的命令,例如grep(此模式是否存在?)和diff(這些檔案是否相同?),1 表示“否”,較高的值表示錯誤。此外,126 以上的數值很少使用,因為它們被烘焙到 shell 中(以及 POSIX 命令commandenvnicenohuptime

  • 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 之間的任何數字,除了保留退出代碼點這裡了解更多

相關內容