Bash
管道中的下一個程序可以看到前一個程序的退出程式碼嗎?
我想製作這樣的 Bash 腳本管道
prog1 | prog2
這樣 prog2 可以看到 prog1 的退出程式碼並根據該資訊採取不同的行動。
這可能嗎?
一般的答案是否定的。甚至可以在開始
prog2
之前退出prog1
(如果實際讀取一些輸入,顯然不會發生這種情況prog2
,如果您在管道中使用它,您會期望它會這樣做)。prog2
之前退出肯定是可以的prog1
;例如,當prog2
搜尋程序找到匹配項後立即退出時,就會發生這種情況,在這種情況下,prog1
可能還沒有完成所有數據的生成。沒有直接的方法
prog2
來檢索退出狀態,prog1
甚至知道prog1
已經退出。所有prog2
可以知道的是,它prog1
已經關閉了管道的末端,它可以在不死的情況下做到這一點。如果要獲取 from 的退出狀態,
prog1
常用prog2
的方法有兩種:可以寫入文件,也可以通過管道發送。可以將輸出狀態作為管道數據的最後一行發送。您必須確保不處理最後一行,直到您知道它是最後一行,即直到您嘗試閱讀下一行。{ prog1; echo $?; } | …
這是一個範例,其中右側是一個文本過濾器,它將包含單詞“error”的每一行都塗成紅色。如果左側失敗,則右側以相同狀態退出。
{ prog1; echo $?; } | awk ' NR != 1 { if (line ~ /[Ee][Rr][Rr][Oo][Rr]/) print "\033[31m" line "\033[0m"; else print line; } {line = $0} END {exit($0)} '