Shell
獲取通過管道傳輸到另一個程序的退出狀態
我有兩個程序,
foo
並且bar
通過管道連接:$ foo | bar
bar
總是退出 0;我對foo
. 有什麼辦法可以解決嗎?
bash
並zsh
有一個數組變數保存由 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_bash
和retval_zsh
將被設置。另一個將是空白的。這將允許函式以return $retval_bash $retval_zsh
(注意缺少引號!)結尾。