Me gustaría implementar una trampa global para mi script bash que active cuando algo falla. El problema es que si tengo una cláusula if que evalúa una función que es un predicado y al evaluar ese predicado hay una falla, entonces no se llama a la trampa. Entiendo que las trampas no se invocan si un predicado devuelve falso, pero no esperaba que la lógica que calcula el predicado también tuviera la trampa deshabilitada. ¿Es correcta mi interpretación del comportamiento y hay alguna forma de que bash invoque una trampa en la lógica que calcula un predicado?
Por ejemplo,
$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1
Hasta ahora, todo bien. Defino una trampa, pido que cualquier falla active la trampa y pido que todas las funciones hereden la trampa. Luego llamo bar
a cuál llama foo
cuál falla, invoco la trampa e imprimo el código de error 1
.
$ if bar; then echo true; fi
true
Esto es inesperado. Esperaba que el resultado fuera 1
. Esperaba que solo bar
se excluyera de la consideración el código de retorno de. Lo que realmente sucede, creo, es que toda la lógica interna bar
estambiénexcluidos de la consideración. ¿Es así como funciona bash? ¿Hay alguna manera de especificar que cualquier lógica bar
que falle (por ejemplo, la llamada a foo
) antes de la última declaración (por ejemplo, el return 0;
) debería activar la trampa?