Kann jemand das Bash / Set-e-Verhalten im folgenden Code-Snippet erklären?
#!/bin/bash
# Comment if you want to test the trap only
set -e -o pipefail -u -E
# Comment if you want to test the set -e only
trap "echo ERROR CAUGHT; exit 12" ERR
function reproduce() {
# Trigger arithmetic error on purpose
a=$((1109962735 - hello=12272 + 1))
}
reproduce
# The script is expected to trigger the trap and/or activate the set -e. In both cases it should stop and exit here on error.
status_code=$?
echo "STATUS ${status_code}"
if [[ "${status_code}" != "0" ]];then
echo "FIXME: why was status code not caught by set -e ?"
echo "Executing false to prove set -e is still active"
false
# If the following is not executed then it proves -e is still active
echo "set -e not active !!!!!"
exit 2
fi
Folgendes wird bei der Ausführung erhalten:
$ bash reproduce.sh
reproduce.sh: line 8: 1109962735 - hello=12272 + 1: attempted assignment to non-variable (error token is "=12272 + 1")
STATUS 1
FIXME: why was status code it not caught by set -e ?
Executing false to prove set -e is still active
ERROR CAUGHT
Überprüfen des Exit-Codes
$ echo $?
1
Bash-Version
bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Auch reproduziert mit
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Zusätzliche Hinweise zu Kommentaren (trotzdem danke an alle Vorschläge):
- Das Kommentieren der Falle ändert nichts an dem beobachteten seltsamen Verhalten
- Wenn Sie set -e entfernen, um nur die Falle zu behalten, wird die Falle ebenfalls ausgelöst
trapstattdessen einfach den Mechanismus verwenden, z trap "exit 2" ERR. Auch für mich druckt Ihr Skript nur "STATUS 0". Die ERR-Falle wird anscheinend nicht von Shell-Funktionen geerbt. Hilft dies : set -o errtrace? Ansonsten siehe meinen Link oben, warum du das überhaupt vermeiden solltest set -e.
set -emittrap.trapwird bei einem Fehler aufgerufen und "echo ERROR CAUGHT" wird aufgerufen. Ich habe den Eindruck, dasstrapVorrang hat alsset -e. Laut Bash-FAQ, die ich fürset -eentmutigt halte , überprüfen Sie bitte mywiki.wooledge.org/BashFAQ/105 .