Bash

before last 命令的退出程式碼?

  • September 3, 2016

我在腳本 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:一個數組變數,包含最近執行的前台管道(可能只包含一個命令)中程序的退出狀態值列表。

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