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
denke ich '$' ist richtig. Dein Skript druckt "1" für mich. – dogbane
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. –
Für alle, die suchen, [eine ähnliche Frage ist hier] (http://stackoverflow.com/q/32086595/471376). – JamesThomasMoon1979