¿Alguien puede explicar el comportamiento bash / set -e en el fragmento de código a continuación?
#!/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
Esto es lo que se obtiene al ejecutarlo:
$ 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
Comprobando el código de salida
$ echo $?
1
Versión bash
bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Reproducido también con
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Notas adicionales, relacionadas con comentarios (gracias a todas las sugerencias de todos modos):
- La trampa de comentarios no cambia el comportamiento extraño observado
- Eliminar set -e para mantener la trampa solo activa la trampa.
trap
mecanismo en su lugar, por ejemplo trap "exit 2" ERR
. También para mí, su script imprime "STATUS 0" solamente. Parece que la trampa ERR no es heredada por las funciones de shell, ¿esto ayuda set -o errtrace
? De lo contrario, vea mi enlace anterior sobre por qué debe evitar set -e
en primer lugar.
set -e
contrap
.trap
se invoca en caso de error y se invoca "echo ERROR CAUGHT". Tengo la impresión de quetrap
tiene mayor prioridad queset -e
. También de acuerdo con las preguntas frecuentes de Bash, creo que noset -e
se recomienda , consulte mywiki.wooledge.org/BashFAQ/105 .