Nach jedem Befehl befindet sich der Exit-Code in der $?
Variablen, sodass Sie Folgendes haben:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Sie müssen vorsichtig mit Piped-Befehlen sein, da der $?
einzige nur den Rückkehrcode des letzten Elements in der Pipe enthält, also im Code:
ls -al file.ext | sed 's/^/xx: /"
gibt keinen Fehlercode zurück, wenn die Datei nicht vorhanden ist (da der sed
Teil der Pipeline tatsächlich funktioniert und 0 zurückgibt).
Die bash
Shell stellt tatsächlich ein Array bereit, das in diesem Fall hilfreich sein kann PIPESTATUS
. Dieses Array verfügt über ein Element für jede Pipeline-Komponente, auf das Sie einzeln zugreifen können ${PIPESTATUS[0]}
:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Beachten Sie, dass Sie damit das Ergebnis des false
Befehls erhalten, nicht die gesamte Pipeline. Sie können auch die gesamte Liste nach Belieben verarbeiten lassen:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Wenn Sie den größten Fehlercode aus einer Pipeline erhalten möchten, können Sie Folgendes 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 nacheinander durch jedes der PIPESTATUS
Elemente und speichert es, rc
wenn es größer als der vorherige rc
Wert war.