J'utilise set -e pour arrêter le script bash à la première erreur.
Tout fonctionne correctement sauf si j'utilise la commande avec && :
$ 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
$
par rapport à :
$ 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
$
Le premier exemple fait toujours écho à I'm running! , mais pas le second. Pourquoi se comportent-ils différemment ?
UPD. Question similaire :https://stackoverflow.com/questions/6930295/set-e-and-short-tests
Réponse acceptée :
C'est un comportement documenté.
La page de manuel bash(1) indique, pour set -e ,
Le shell ne se ferme pas si la commande qui échoue
fait partie de la liste de commandes
immédiatement après unwhileouuntilmot-clé,
partie du test suivant leifouelifmots réservés, partie de toute commande exécutée dans un&&ou||liste sauf la commande suivant le dernier&&ou||,
toute commande dans un pipeline sauf la dernière,
ou si la valeur de retour de la commande est inversée avec!.
[Soulignement ajouté.]
Et le langage de commande shell POSIX La spécification confirme qu'il s'agit du comportement correct :
Le
-eparamètre doit être ignoré
lors de l'exécution de la liste composée
suivant lewhile,until,if, ouelifmot réservé,
un pipeline commençant par le!mot réservé,
ou toute commande d'une liste AND-OR autre que la dernière.
et Section 2.9.3 Listes de ce document définit
Une liste AND-OR est une séquence d'un ou plusieurs pipelines
séparés par les opérateurs "&&” et “||".