Nach jedem Befehl kann der Exit-Code in der $?
Variablen gefunden werden, also hättest du so etwas:
ls -al datei.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Man muss bei gepipeten Befehlen vorsichtig sein, da $?
nur den Rückgabecode des letzten Elements im Pipe zurückgibt, also im Code:
ls -al datei.ext | sed 's/^/xx: /"
wird kein Fehlercode zurückgegeben, wenn die Datei nicht existiert (da der sed
Teil der Pipeline tatsächlich funktioniert und 0 zurückgibt).
Die bash
Shell bietet tatsächlich ein Array an, das in diesem Fall hilfreich sein kann, und das ist PIPESTATUS
. Dieses Array hat ein Element für jede der Pipeline-Komponenten, das du einzeln abrufen kannst, z.B. ${PIPESTATUS[0]}
:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Bitte beachte, dass dies dir das Ergebnis des false
Befehls gibt, nicht der gesamten Pipeline. Du kannst auch die gesamte Liste abrufen, um sie nach Belieben zu verarbeiten:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Wenn du den größten Fehlercode aus einer Pipeline erhalten möchtest, könntest du etwas wie folgt verwenden:
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Dies geht jedes der PIPESTATUS
Elemente nacheinander durch und speichert es in rc
, wenn es größer als der vorherige rc
Wert war.
0 Stimmen
Harter Weg: Testen Sie den Wert von
$?
nach jedem Befehl. Einfacher Weg: Geben Sieset -e
oder#!/bin/bash -e
oben in Ihr Bash-Skript ein.