Bash

當孩子以非零退出程式碼退出時,父腳本繼續

  • September 6, 2016

我有一個呼叫另一個腳本的腳本。當子腳本失敗時,我希望父腳本也失敗。

在子腳本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

結合約翰的建議,我有一個似乎可行的解決方案。

引用自:https://unix.stackexchange.com/questions/186826