Weitergabe des Exit-Codes an den Aufrufer im Falle eines Shell-Fehlers aus einem Skript mit einer Exit-Trap
Frage
Ist es möglich, im Falle eines Syntaxfehlers in einem Bash-Skript mit einer EXIT-Trap einen Exit-Code an den Aufrufer weiterzugeben?Wenn ich zum Beispiel:
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
Wenn Sie es dann ausführen, erhalten Sie den Exit-Code 0, auch wenn das Skript nicht wirklich erfolgreich beendet wurde:
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
Aber wenn ich die Exit-Trap auskommentiere, gibt das Skript 1 zurück.Wenn ich alternativ die Zeile mit der ungebundenen Variablen durch einen Befehl ersetze, der ungleich Null zurückgibt (z. B. /bin/false
), wird dieser Exit-Wert so weitergegeben, wie ich es möchte.
Lösung 2
Dieses Verhalten bezieht sich auf verschiedene Bash-Versionen.Das Originalskript arbeitet wie erwartet auf Bash 4.2, aber nicht auf 3.2.Wenn Sie den fehleranfälligen Code in einer separaten Skriptdatei haben, und lauft es in einer Unterschale um Probleme in früheren Bash-Versionen:
generasacodicetagpre.sub.sh:
generasacodicetagpre.Andere Tipps
Die Shell wird mit dem Ergebnis des zuletzt ausgeführten Befehls beendet.In Ihrem Falle ist das so echo
, was normalerweise mit Erfolg zurückkehrt.
Einfach Ihren Wert verbreiten exit
damit.
#!/bin/bash
set -eu
die() {
echo "Dying!!"
exit "$1"
}
trap 'die $?' EXIT
echo yeah
echo $unbound
echo boo
Beachten Sie das auch set -e
gilt als schädlich – es lässt den Eindruck entstehen, dass das Skript beendet wird, wenn ein Befehl fehlschlägt, was nicht immer der Fall ist.