Per essere al sicuro, vorrei che bash interrompesse l'esecuzione di uno script se si verifica un errore di sintassi.
Con mia sorpresa, non riesco a raggiungere questo obiettivo. ( set -e
non è abbastanza.) Esempio:
#!/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!'
Risultato (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!
$
Bene, non possiamo controllare $?
dopo ogni istruzione per rilevare errori di sintassi.
(Mi aspettavo un comportamento così sicuro da un linguaggio di programmazione ragionevole ... forse questo deve essere segnalato come un bug / desiderio di colpire gli sviluppatori)
Altri esperimenti
if
non fa differenza.
Rimozione 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!'
Risultato:
$ ./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!
$
Forse, è legato all'esercizio 2 di http://mywiki.wooledge.org/BashFAQ/105 e ha qualcosa a che fare con (( ))
. Ma trovo ancora irragionevole continuare a eseguire dopo un errore di sintassi.
No, (( ))
non fa differenza!
Si comporta male anche senza il test aritmetico! Solo uno script semplice e di base:
#!/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!'
Risultato:
$ ./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
non ha funzionato. Ma la mia domanda ha ancora senso. È possibile interrompere qualsiasi errore di sintassi?
set -e
non è sufficiente perché l'errore di sintassi è inif
un'istruzione. In qualsiasi altro posto dovrebbe interrompere la sceneggiatura.