Die allgemeine Antwort lautet nein. Es ist möglich prog2
, vor dem prog1
Start zu beenden (dies kann natürlich nicht passieren, wenn prog2
tatsächlich eine Eingabe gelesen wird, was Sie erwarten würden, wenn Sie sie in einer Pipeline verwenden). Es ist definitiv möglich prog2
, vorher zu beenden prog1
; Dies ist beispielsweise prog2
der Fall, wenn ein Suchprogramm beendet wird, sobald eine Übereinstimmung gefunden wird. In diesem Fall sind prog1
möglicherweise noch nicht alle Daten vollständig erstellt.
Es gibt keine direkte Möglichkeit prog2
, den Exit-Status von Exit abzurufen prog1
oder gar zu wissen, dass es beendet prog1
wurde. Alles was prog2
man wissen kann ist, dass prog1
es sein Rohrende geschlossen hat, was es tun kann, ohne zu sterben.
Wenn Sie den Exit-Status von prog1
von erhalten möchten prog2
, gibt es zwei gängige Methoden: Sie können ihn in eine Datei schreiben oder über die Pipe senden. Das Senden des Ausgabestatus als letzte Zeile der weitergeleiteten Daten ist möglich. Sie müssen sicherstellen, dass die letzte Zeile erst verarbeitet wird, wenn Sie wissen, dass es sich um die letzte Zeile handelt, dh bis Sie versucht haben, die nächste Zeile zu lesen.
{ prog1; echo $?; } | …
Hier ist ein Beispiel, in dem die rechte Seite ein Textfilter ist, der jede Zeile mit dem Wort „Fehler“ rot färbt. Wenn die linke Seite ausfällt, wird die rechte Seite mit demselben Status beendet.
{ 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)}
'