Bash
當孩子以非零退出程式碼退出時,父腳本繼續
我有一個呼叫另一個腳本的腳本。當子腳本失敗時,我希望父腳本也失敗。
在子腳本
child_1.sh
中,我有這樣的東西:if [ $SOME_BAD_CONDITION ] ; then echo "Error message...." exit 1 fi
在父母中,我有這個:
#!/bin/bash set -e #... bash ./child_1.sh echo "continuing to next step..." bash ./child_2.sh bash ./child_3.sh #...
我已經設置了我的環境,這樣
$SOME_BAD_CONDITION
總是會發生,並且腳本按預期退出並且確實列印了錯誤消息,但是父腳本繼續:列印消息“繼續…”並且下一個腳本開始執行。我認為
set -e
如果存在任何具有非零退出程式碼的子腳本,則可以確保我的父腳本失敗,但這似乎沒有發生。我不確定我在這裡做錯了什麼……bash 版本:4.2.25
更新:
我嘗試回顯
$?
:bash ./child_1.sh echo $? echo "continuing to next step..."
輸出如下所示:
錯誤資訊.... 0 繼續下一步...
為什麼孩子的退出程式碼沒有進入父母?
解答: 原始程式碼片段不完整。位於
exit 1
通過管道傳送到 tee 的程式碼塊內。我試圖發布一個乾淨、簡短的程式碼範例忽略了這一點,因為我沒有意識到它有多麼重要(我對 bash 腳本仍然很陌生)。有關詳細資訊,請參閱我發布的答案。
因此,我可能在沒有發布有關子腳本的足夠詳細資訊時犯了一個錯誤——我出於這個問題的目的對其進行了簡化,但可能太多了。該
exit
語句被隱藏在一個程式碼塊中(介於{
和之間}
),該程式碼塊通過管道傳輸到tee
日誌記錄中:{ #... if [ $SOME_BAD_CONDITION ] ; then exit 1 fi #... } | tee -a $LOGFILE echo "script ended at $date">>$LOGFILE
據我了解,我總是從這個子腳本中得到一個返回碼 0,因為最後一個
echo
返回的是 0。我做了一些研究並發現了 $PIPESTATUS。我能夠使用它來確保當我的腳本嘗試以退出程式碼 1 退出時,它將被傳遞給父腳本:{ #... } | tee -a $LOGFILE EXIT_CODE=${PIPESTATUS[0]} echo "script ended at $date">>$LOGFILE exit $EXIT_CODE
結合約翰的建議,我有一個似乎可行的解決方案。