Por segurança, eu gostaria que o bash abortasse a execução de um script se ele encontrar um erro de sintaxe.
Para minha surpresa, não posso conseguir isso. ( set -e
não é suficiente.) Exemplo:
#!/bin/bash
# Do exit on any error:
set -e
readonly a=(1 2)
# A syntax error is here:
if (( "${a[#]}" == 2 )); then
echo ok
else
echo not ok
fi
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Resultado (bash-3.2.39 ou bash-3.2.51):
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 10: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
Bem, não podemos verificar $?
após cada instrução para detectar erros de sintaxe.
(Eu esperava um comportamento tão seguro de uma linguagem de programação sensata ... talvez isso deva ser relatado como um bug / desejo para atacar os desenvolvedores)
Mais experiências
if
Não faz diferença.
Removendo if
:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
(( "${a[#]}" == 2 ))
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Resultado:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
Talvez esteja relacionado ao exercício 2 de http://mywiki.wooledge.org/BashFAQ/105 e tenha algo a ver com isso (( ))
. Mas acho que ainda não é razoável continuar executando após um erro de sintaxe.
Não, (( ))
não faz diferença!
Comporta-se mal, mesmo sem o teste aritmético! Apenas um script simples e básico:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
echo "${a[#]}"
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Resultado:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
set -e
não funcionou. Mas minha pergunta ainda faz sentido. É possível cancelar qualquer erro de sintaxe?
set -e
não é suficiente porque seu erro de sintaxe está em umaif
instrução Em qualquer outro lugar deve abortar o script.