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 unwhile
ouuntil
mot-clé,
partie du test suivant leif
ouelif
mots 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
-e
paramètre doit être ignoré
lors de l'exécution de la liste composée
suivant lewhile
,until
,if
, ouelif
mot 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 “||
".