Bash

管道中的下一個程序可以看到前一個程序的退出程式碼嗎?

  • July 11, 2014

我想製作這樣的 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)}
'

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