Como afirmar dentro da função bash independentemente da verificação lógica?

Como afirmar dentro da função bash independentemente da verificação lógica?

Gostaria de implementar uma armadilha global para meu script bash que eu acionarei quando algo falhar. O problema é que se eu tiver uma cláusula if que esteja avaliando uma função que é um predicado e ao avaliar esse predicado houver uma falha, então a armadilha não será chamada. Entendo que as armadilhas não são invocadas se um predicado retornar falso, mas não esperava que a lógica que computa o predicado também tivesse a armadilha desativada. Minha interpretação do comportamento está correta e existe alguma maneira de o bash invocar uma armadilha na lógica computando um predicado?

Por exemplo,

$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1

Até agora tudo bem. Eu defino uma armadilha, peço que qualquer falha acione a armadilha e peço que todas as funções herdem a armadilha. Então eu chamo barquais chamadas foofalham, invoca a armadilha e imprime o código de erro 1.

$ if bar; then echo true; fi
true

Isto é inesperado. Eu esperava que a saída fosse 1. Eu esperava que apenas o código de retorno barfosse excluído da consideração. O que realmente acontece, eu acho, é que toda a lógica interna barétambémexcluído da consideração. É assim que o bash funciona? Existe uma maneira de especificar que qualquer lógica barque falhe (por exemplo, a chamada para foo) antes da última instrução (por exemplo, o return 0;) deve acionar a armadilha?

informação relacionada