Alguém pode explicar o comportamento bash / set -e no snippet de código abaixo?
#!/bin/bash
# Comment if you want to test the trap only
set -e -o pipefail -u -E
# Comment if you want to test the set -e only
trap "echo ERROR CAUGHT; exit 12" ERR
function reproduce() {
# Trigger arithmetic error on purpose
a=$((1109962735 - hello=12272 + 1))
}
reproduce
# The script is expected to trigger the trap and/or activate the set -e. In both cases it should stop and exit here on error.
status_code=$?
echo "STATUS ${status_code}"
if [[ "${status_code}" != "0" ]];then
echo "FIXME: why was status code not caught by set -e ?"
echo "Executing false to prove set -e is still active"
false
# If the following is not executed then it proves -e is still active
echo "set -e not active !!!!!"
exit 2
fi
Aqui está o que é obtido ao executá-lo:
$ bash reproduce.sh
reproduce.sh: line 8: 1109962735 - hello=12272 + 1: attempted assignment to non-variable (error token is "=12272 + 1")
STATUS 1
FIXME: why was status code it not caught by set -e ?
Executing false to prove set -e is still active
ERROR CAUGHT
Verificando o código de saída
$ echo $?
1
Versão Bash
bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Reproduzido também com
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Notas adicionais, relacionadas a comentários (de qualquer forma, obrigado por todas as sugestões):
- A armadilha de comentários não altera o comportamento estranho observado
- A remoção de set -e para manter apenas a armadilha aciona a armadilha
trap
mecanismo, por exemplo trap "exit 2" ERR
. Também para mim, seu script imprime apenas "STATUS 0". A armadilha de ERR não é herdada pelas funções do shell, ao que parece, isso ajuda set -o errtrace
:? Caso contrário, veja meu link acima sobre por que você deve evitar set -e
em primeiro lugar.
set -e
comtrap
.trap
é chamado em erro e "eco ERRO CAUGHT" é chamado. Tenho a impressão de quetrap
tem maior precedência do queset -e
. Também de acordo com as Perguntas frequentes sobre o Bash, achoset -e
desanimado, consulte mywiki.wooledge.org/BashFAQ/105 .