Nach einem ausgeführten Kommando kann man sich per echo $? den Return-Wert dieses ausgeben lassen.
Bei einer Pipesequenz funktioniert das leider nicht so, wie man es gerne hätte, z.B. bei echo haha | asdsdsd | grep haha.
Diese Zeile liefert folgenden Output: asdsdsd: Befehl nicht gefunden.
Möchte man nun den Return-Wert überprüfen, um in einem Script darauf entsprechend zu reagieren, bekommt man:
echo $? 1
Die 1 stammt in diesem Fall von grep, da dieser den Suchstring nicht gefunden hat. Es wird also das letzte Kommando betrachtet. Dass jedoch der zweite Befehl völliger Unsinn war, merkt man nicht.
Man sollte in einem solchen Fall den Returnwert per Pipestatus in Erfahrung bringen:
echo pipestatus: ${PIPESTATUS[*]} returncode: $?
pipestatus: 0 127 1 returncode: 1
Man sieht hier noch einmal im Vergleich die Return-Werte. Pipestatus liefert uns 0 (echo) 127 (asdsdsd ⇒ unbekannter Befehl) 1 (grep). Für jeden weiteren Befehl in der Pipesequenz kommt eine Return-Wert dazu. In diesem Bespiel könnte man per test ${PIPESTATUS[*]} = 0 0 0 vergleichen, ob die Sequenz fehlerfrei war. Oder man spricht gezielt den zweiten Befehl per ${PIPESTATUS[1]} an.