A propagação de código de saída para o chamador no caso de uma concha de erro de script de ter uma saída armadilha
Pergunta
É possível propagar-se um código de saída para o chamador no caso de um erro de sintaxe no script Bash com uma SAÍDA armadilha?Por exemplo, se eu tenho:
#! /bin/bash
set -eu
trap "echo dying!!" EXIT
echo yeah
echo $UNBOUND_VARIABLE
echo boo
Em seguida, executando dá um código de saída 0, mesmo se o script realmente não terminar com êxito:
$ bash test.sh
yeah
test.sh: line 8: UNBOUND_VARIABLE: unbound variable
dying!!
$ echo $?
0
Mas se eu comentar a sair da armadilha, o script retorna 1.Em alternativa, se eu substituir a linha com a variável independente com um comando que retorna diferente de zero (por exemplo, /bin/false
), que o valor de saída é propagada como eu gostaria.
Solução 2
Este comportamento está relacionado com diferentes Bash versões.O script original funciona como esperado no Bash 4.2, mas não 3.2.Tendo o sujeito a erros de código em um arquivo de script separado e executando-a em um sub-shell funciona em torno de problemas anteriores Bash versões:
#!/bin/bash
$BASH sub.sh
RETVAL=$?
if [[ "$RETVAL" != "0" ]]; then
echo "Dying!! Exit code: $RETVAL"
fi
sub.sh:
set -eu
echo yeah
echo $UNBOUND_VARIABLE
echo boo
Outras dicas
O shell termina com o resultado do último comando executado.Em sua armadilha caso, que echo
, que geralmente retorna com sucesso.
Para propagar o seu valor, basta exit
com ele.
#!/bin/bash
set -eu
die() {
echo "Dying!!"
exit "$1"
}
trap 'die $?' EXIT
echo yeah
echo $unbound
echo boo
Observe também que set -e
é considerado prejudicial -- faz você pensar que o script vai sair se um comando falhar, o que não é sempre que fazer.