Para estar seguro, me gustaría que bash aborte la ejecución de un script si encuentra un error de sintaxis.
Para mi sorpresa, no puedo lograr esto. ( set -e
no es suficiente) Ejemplo:
#!/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 o 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!
$
Bueno, no podemos verificar $?
después de cada declaración para detectar errores de sintaxis.
(Esperaba un comportamiento tan seguro de un lenguaje de programación sensible ... tal vez esto debe ser reportado como un error / deseo de criticar a los desarrolladores)
Más experimentos
if
No hace diferencia.
Removiendo 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!
$
Quizás, está relacionado con el ejercicio 2 de http://mywiki.wooledge.org/BashFAQ/105 y tiene algo que ver (( ))
. Pero todavía me parece irrazonable continuar ejecutando después de un error de sintaxis.
No, (( ))
no hay diferencia!
¡Se comporta mal incluso sin la prueba aritmética! Solo un script simple y 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
no ha funcionado. Pero mi pregunta aún tiene sentido. ¿Es posible abortar en cualquier error de sintaxis?
set -e
no es suficiente porque su error de sintaxis está en unaif
declaración. En cualquier otro lugar debería abortar el script.