Bash
before last 命令的退出程式碼?
我在腳本 release.sh 和 caller.sh 中執行腳本(caller.sh 呼叫 release.sh)。兩者都是bash。
release.sh 包含一堆帶有“exit 1”的錯誤條件。
caller.sh 包含一行“./release.sh”,然後檢查 release.sh 的退出程式碼 - 如果 $? 大於 0 然後回顯“release.sh 搞砸了”並退出。
./release.sh if [ $? -gt "0" ] ; then echo "release_manager exited with errors, please see the release log." exit 1 else echo "release manager is done." fi
最近我決定記錄 release.sh,所以 caller.sh 中的行是:
./release.sh 2>&1 | tee release.txt
因為管道,$? 是 ’tee release.txt’ 的退出程式碼,無論前面的命令如何,它總是顯示為 0 :-(
我必須檢查 release.sh 錯誤並阻止呼叫者繼續,但我也確實需要該日誌。
有沒有辦法在最後之前獲取命令的退出程式碼?或者以不同的方式在同一命令中記錄發布腳本?
我不是真正負責 release.sh,我寧願不改變它。
由於您使用的是 bash,因此您可以在腳本中設置以下選項:
set -o pipefail
管道的返回狀態是最後一個(最右邊)以非零狀態退出的命令的值,如果所有命令都成功退出,則返回為零。
或者,在管道命令之後,您可以立即查看管道中第一個命令的退出程式碼的內置變數值
${PIPESTATUS[0]}
。PIPESTATUS:一個數組變數,包含最近執行的前台管道(可能只包含一個命令)中程序的退出狀態值列表。