¿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.
trapmecanismo 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 -een primer lugar.
set -econtrap.trapse invoca en caso de error y se invoca "echo ERROR CAUGHT". Tengo la impresión de quetraptiene mayor prioridad queset -e. También de acuerdo con las preguntas frecuentes de Bash, creo que noset -ese recomienda , consulte mywiki.wooledge.org/BashFAQ/105 .