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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top