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 -enã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 -enão funcionou. Mas minha pergunta ainda faz sentido. É possível cancelar qualquer erro de sintaxe?
set -enão é suficiente porque seu erro de sintaxe está em umaifinstrução Em qualquer outro lugar deve abortar o script.