Bash
為什麼腳本的退出程式碼看起來與返回的值不同?
我有一個呼叫另一個腳本(create-docker-container.sh)的腳本(run-docker-container.sh)。create-docker-container 針對 docker 遠端 api 執行 curl 腳本並返回 http 程式碼,如果成功則返回零。創建腳本因此返回
echo $RVAL exit $RVAL
在我的測試中,$RVAL 的值為 404,這是我對這個問題感興趣的值。
在我的 run-docker-container 腳本中,我有以下幾行
create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS rval=$? echo $rval if [ $rval -eq 404 ]; then ... fi
即使 create 似乎以 404 退出,我得到的值
$?
是 148,因此我的條件處理沒有被呼叫。為什麼會這樣,我如何正確地從腳本中獲取退出程式碼?
由於歷史原因,程序的退出狀態是一個 8 位數字。您傳遞給的數字以
exit
256 (2⁸) 為模減少。此外,值 126 及以上具有正常含義,表示無法啟動程序(126 或 127)或被信號終止的程序(128 及以上)。因此,雖然您可以返回這樣的值,但除非您想模擬這些條件,否則您不應該這樣做。
規則是返回 0 表示成功,返回一些其他值表示錯誤。這是一條規則,因為許多工具將 0 解釋為成功:條件命令,例如
if
andwhile
,工具在錯誤時中止,例如set -e
和 makefile 下的 shell 腳本等。關於錯誤,最常見的約定是在任何錯誤時返回 1,或在任何錯誤時返回 2。第三個最常見的約定是在預期失敗時返回 1(例如,搜尋命令什麼也沒找到),在意外失敗時返回 2(例如要搜尋的文件不存在)。如果您需要將 HTTP 錯誤程式碼映射到退出狀態,則可以使用 1-125 範圍(200 成功映射到 0),沒有標準。