Pour être sûr, j'aimerais que bash abandonne l'exécution d'un script s'il rencontre une erreur de syntaxe.
À ma grande surprise, je ne peux pas y arriver. ( set -e
ne suffit pas.) Exemple:
#!/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!'
Résultat (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!
$
Eh bien, nous ne pouvons pas vérifier $?
après chaque instruction pour détecter les erreurs de syntaxe.
(Je m'attendais à un tel comportement sûr d'un langage de programmation raisonnable ... peut-être que cela doit être signalé comme un bug / souhait de bash développeurs)
Plus d'expériences
if
ça ne fait aucune différence.
Suppression 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!'
Résultat:
$ ./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!
$
Peut-être que cela est lié à l'exercice 2 de http://mywiki.wooledge.org/BashFAQ/105 et a quelque chose à voir avec (( ))
. Mais je trouve toujours déraisonnable de continuer à exécuter après une erreur de syntaxe.
Non, (( ))
cela ne fait aucune différence!
Il se comporte mal même sans le test arithmétique! Juste un script simple et basique:
#!/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!'
Résultat:
$ ./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'a pas fonctionné. Mais ma question a toujours un sens. Est-il possible d'interrompre une erreur de syntaxe?
set -e
n'est pas suffisant car votre erreur de syntaxe se trouve dans uneif
instruction. N'importe où ailleurs devrait abandonner le script.