Die allgemeine Antwort lautet nein. Es ist möglich prog2, vor dem prog1Start zu beenden (dies kann natürlich nicht passieren, wenn prog2tatsä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 prog2der Fall, wenn ein Suchprogramm beendet wird, sobald eine Übereinstimmung gefunden wird. In diesem Fall sind prog1möglicherweise noch nicht alle Daten vollständig erstellt.
Es gibt keine direkte Möglichkeit prog2, den Exit-Status von Exit abzurufen prog1oder gar zu wissen, dass es beendet prog1wurde. Alles was prog2man wissen kann ist, dass prog1es sein Rohrende geschlossen hat, was es tun kann, ohne zu sterben.
Wenn Sie den Exit-Status von prog1von 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)}
'