¿Cómo hacer valer la función bash interna independientemente de la verificación lógica?

¿Cómo hacer valer la función bash interna independientemente de la verificación lógica?

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 bara cuál llama foocuá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 barse excluyera de la consideración el código de retorno de. Lo que realmente sucede, creo, es que toda la lógica interna barestambiénexcluidos de la consideración. ¿Es así como funciona bash? ¿Hay alguna manera de especificar que cualquier lógica barque falle (por ejemplo, la llamada a foo) antes de la última declaración (por ejemplo, el return 0;) debería activar la trampa?

información relacionada