Acabei de encontrar um erro em que faltava uma função em meu script. Já trap
levantei essas exceções para parar o script mais cedo, mas notei que isso não ocorreu. Investigando isso mais a fundo, descobri que os erros que ocorrem como parte de uma expressão lógica são considerados parte dessa expressão e não um erro em si.
Veja este trecho, por exemplo:
function _raise_error() {
>&2 echo "Error on line $1"
}
trap '_raise_error $LINENO' ERR
# STDERR: _missing_function: command not found
_missing_function && echo "This expression is never true"
echo "This is printed, because the missing function error is not trapped"
Existe uma maneira melhor de escrever esse código de forma mais defensiva para que o script termine mais cedo em uma função ausente em uma expressão lógica? Não tenho certeza de como capturar isso. Usar set -e
não faz diferença nesse caso, pois já estou interceptando o erro e finalizando o script.
Meu melhor palpite é que preciso encerrar a linha false
. Isso é menos do que desejável, mas não consigo pensar em uma maneira melhor.
_missing_function && { echo "This expression is never true"; } || false
Para esse erro específico, você poderia fazer:
ou se você preferir apenas ter
_raise_error()
chamado de uma armadilha e deixá-lo fazer o seguinteexit
:Para mais informações consulte:
command_not_found_handle()
- https://www.gnu.org/software/bash/manual/html_node/Command-Search-and-Execution.htmlBASH_LINENO[]
- https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.htmlSIGUSR1
- https://www.gnu.org/software/libc/manual/html_node/Miscellaneous-Signals.htmlexit 127
- https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html