Exit code in einer pipe

Zugegeben, der Titel klingt nach Drogenmissbrauch, aber es geht um etwas anderes: Um exit codes oder auch status codes genannt.

Programme beenden sich in der Regel mit einem exit code. Das ist im Normalfall 0 für „OK“ und 1 für „Fehler“. Manche Programme kennen noch viele andere exit codes, die beispielsweise die Art des Fehlers dokumentieren. Man kann das selbst in Scripts benutzen und mit dem Befehl exit N, wobei N für den exit code steht, setzen.

Den exit code eines Programms kann man sich mit echo $? anzeigen lassen. Diese Variable gilt immer nur für das letzte beendete Programm. Beispiele:

$ true; echo $?
0
$ false; echo $?
1

Was aber, wenn man den exit code eines Programms haben will, dessen output man durch eine Pipe (|) schickt, etwa um ihn mit grep zu filtern. Das Problem ist dann, dass man den exit code von grep bekommt, der in der Regel 0 ist und nicht den des Programmes am Anfang der Pipe, der einen interessiert. Beispiele:

$ true | true; echo $?
0
$ false | true; echo $?
0

Die Lösung, zumindest in der bash, ist die Variable $PIPESTATUS. Sie ist ein Array mit allen exit codes einer Pipe. Beispiele:

$ false | true | false | true; echo "${PIPESTATUS[0]}"
1
$ false | true | false | true; echo "${PIPESTATUS[3]}"
0
$ false | true | false | true; echo "${PIPESTATUS[@]}"
1 0 1 0
Advertisements
Exit code in einer pipe

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s