Shell

獲取通過管道傳輸到另一個程序的退出狀態

  • September 15, 2021

我有兩個程序,foo並且bar通過管道連接:

$ foo | bar

bar總是退出 0;我對foo. 有什麼辦法可以解決嗎?

bashzsh有一個數組變數保存由 shell 執行的最後一個管道的每個元素(命令)的退出狀態。

如果您使用bash,則呼叫數組PIPESTATUS(大小寫很重要!)並且數組索引從零開始:

$ false | true
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0

如果您使用zsh,則呼叫數組pipestatus(大小寫很重要!)並且數組索引從 1 開始:

$ false | true
$ echo "${pipestatus[1]} ${pipestatus[2]}"
1 0

以不失去值的方式將它們組合在一個函式中:

$ false | true
$ retval_bash="${PIPESTATUS[0]}" retval_zsh="${pipestatus[1]}" retval_final=$?
$ echo $retval_bash $retval_zsh $retval_final
1 0

bash在or中執行上述zsh內容,您將得到相同的結果;只有一個retval_bashretval_zsh將被設置。另一個將是空白的。這將允許函式以return $retval_bash $retval_zsh(注意缺少引號!)結尾。

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