So fangen Sie den Beenden Code im Bash -Skript ein
Frage
In meinem Bash -Code gibt es viele Ausstiegspunkte. Ich muss einige Aufräumarbeiten am Ausgang durchführen, also habe ich Trap verwendet, um einen Rückruf für den Ausgang wie diesen hinzuzufügen:
trap "mycleanup" EXIT
Das Problem ist, dass es unterschiedliche Exit -Codes gibt, ich muss entsprechende Reinigungsarbeiten durchführen. Kann ich in MyCleanUp Exit -Code erhalten?
Lösung
Ich denke, Sie können verwenden $?
um den Beendencode zu erhalten.
Andere Tipps
Die akzeptierte Antwort ist im Grunde richtig, ich möchte nur die Dinge klären.
Das folgende Beispiel funktioniert gut:
#!/bin/bash
cleanup() {
rv=$?
rm -rf "$tmpdir"
exit $rv
}
tmpdir="$(mktemp)"
trap "cleanup" INT TERM EXIT
# Do things...
Aber Sie müssen vorsichtiger sein, wenn Sie die Inline -Inline ohne Funktion durchführen. Zum Beispiel funktioniert dies nicht:
trap "rv=$?; rm -rf $tmpdir; exit $rv" INT TERM EXIT
Stattdessen musst du dem entkommen $rv
und $?
Variablen:
trap "rv=\$?; rm -rf $tmpdir; exit \$rv" INT TERM EXIT
Vielleicht möchten Sie auch entkommen $tmpdir
, wie es bewertet wird, wenn die Trap -Linie ausgeführt wird und ob die tmpdir
Wertänderungen später, die Ihnen nicht das erwartete Verhalten geben.
Bearbeiten: Verwendung Shellcheck Um Ihre Bash -Skripte zu überprüfen und sich von solchen Problemen bewusst zu sein.
Ich habe festgestellt, dass es besser ist, die Ausgangsfalle von der Falle für andere Signale zu trennen
Beispiel Trap -Testskript ...
umask 77
tmpfile=`tmpfile.$$`
trap 'rm -f "$tmpfile"' EXIT
trap 'exit 2' HUP INT QUIT TERM
touch $tmpfile
read -r input
exit 10
Die temporäre Datei wird aufgeräumt. Der Datei -Exit -Wert von 10 ist erhalten! Interrupts führen zu einem Ausgangswert von 2
Grundsätzlich, solange Sie "Exit" in einer Ausgangsfalle nicht verwenden, wird es mit dem ursprünglichen Ausgangswert beendet, der erhalten ist.
Abgesehen davon: Beachten Sie das Zitieren in der Ausgangsfalle. Dadurch kann ich ändern, welche Datei während der Lebensdauer während der Skripte aufgeräumt werden muss. Ich füge oft auch einen Test für die Existenz des $ tmpfile vor, bevor ich versuche, ihn zu entfernen, sodass ich sie nicht einmal zu Beginn des Skripts festlegen muss, nur bevor ich es erstellen kann.