Uso set -e
per interrompere lo script bash al primo errore.
Tutto funziona bene a meno che non utilizzi il comando con &&
:
$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$
rispetto a:
$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$
Il primo esempio fa ancora eco a I'm running!
, ma il secondo no. Perché si comportano diversamente?
UPD. Domanda simile:https://stackoverflow.com/questions/6930295/set-e-and-short-tests
Risposta accettata:
Questo è un comportamento documentato.
La pagina man bash(1) dice, per set -e
,
La shell non esce se il comando che non riesce
fa parte dell'elenco dei comandi
immediatamente dopo un while
o until
parola chiave,
parte del test dopo il if
o elif
parole riservate, parte di qualsiasi comando eseguito in un &&
o ||
elenco tranne il comando che segue il &&
finale o ||
,
qualsiasi comando in una pipeline tranne l'ultimo,
o se il valore restituito del comando viene invertito con !
.
[Evidenziazione aggiunta.]
E il Shell Command Language POSIX La specifica conferma che questo è il comportamento corretto:
Il -e
l'impostazione deve essere ignorata
durante l'esecuzione dell'elenco composto
seguendo il while
, until
,if
o elif
parola riservata,
una pipeline che inizia con il !
parola riservata,
o qualsiasi comando di un elenco AND-OR diverso dall'ultimo.
e Sezione 2.9.3 Elenchi di quel documento definisce
Un elenco AND-OR è una sequenza di una o più pipeline
separate dagli operatori “&&
” e “||
“.