2013-09-30 4 views
5

Ich möchte eine Bereinigung Aktion in meine Bash-Skripte haben, wie folgt aus:Holen Sie sich das Exit-Wert des Shell-Skript in einer „Falle EXIT“

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

true 
false 

$? Verwendung war eine natürliche Wahl in den Sinn, aber das ist nicht der Fall. Es enthält immer 0. Gibt es eine Möglichkeit, dass ich den Exitcode in der ERR Falle "ausspionieren" kann?

[Update:] Ich habe keine Ahnung, was ich vorher getestet hatte. Dieser Code funktioniert wie ein Zauber, also verlasse ich ihn hier als kleines und gutes Beispiel.

+0

denke ich '$' ist richtig. Dein Skript druckt "1" für mich. – dogbane

+0

Hah, ich weiß was schief gelaufen ist. Als ich dieses Feature getestet habe, habe ich einen Einzeiler geschrieben und falsch zitiert. Sagen wir "Trap" -Echo, das mit $ endet? " ERR' funktioniert eindeutig nicht, da das '$?' Bei der _definition_ der 'trap'-Aktion ausgewertet wird. –

+0

Für alle, die suchen, [eine ähnliche Frage ist hier] (http://stackoverflow.com/q/32086595/471376). – JamesThomasMoon1979

Antwort

3

Ihr (wahrscheinlich vereinfacht) Beispiel zeigt nicht das Problem, die Sie erwähnt haben:

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ true 
+ false 
++ echo 'E: failed with exitcode 1' 
E: failed with exitcode 1 

Die Chancen stehen gut, dass der Befehl Rückkehr ERR in einem && oder || ausgeführt wird, oder die unter anderen Bedingungen in dem Ausschnitt unten erwähnt. Zitiert aus der manual:

Wenn ein sigspecERR ist, wird der Befehl Arg- ausgeführt wird, wenn ein einfacher Befehl ein Nicht-Null-Exit-Status hat, gelten die folgenden Bedingungen . Die ERR Falle wird nicht ausgeführt, wenn der ausgefallene Befehl sofort Teil der Befehlsliste ist nach einem until oder while Stichwort, Teil des Tests nach den if oder elif reservierten Worten, Teil eines in einer ausgeführten Befehl && oder || Liste oder wenn der Rückkehrstatus des Befehls mit ! invertiert wird. Dies sind die gleichen Bedingungen, die die Option errexit erfüllt.

Also, wenn Sie zum Beispiel die folgenden:

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

false && true 

Ausgeführt es würde nicht dazu führen, die Ausfall gefangen zu sein:

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ false 
Verwandte Themen