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 bar
quais chamadas foo
falham, 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 bar
fosse 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 bar
que falhe (por exemplo, a chamada para foo
) antes da última instrução (por exemplo, o return 0;
) deve acionar a armadilha?