J'utilise set -e
pour arrêter le script bash à la première erreur .
Tout fonctionne bien 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
$
comparé à:
$ 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: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
907e
la source
la source
cd
commande infructueuseset -e
comportement est surprenant.Réponses:
Il s'agit d'un comportement documenté. La page de manuel bash (1) indique, par exemple
set -e
,Et la spécification du langage de commande du shell POSIX confirme qu'il s'agit du comportement correct:
et la section 2.9.3 Listes de ce document définit
la source
L'
set -e
option n'a pas d'effet dans certaines situations, et c'est le comportement standard et portable à travers le shell compatible POSIX.La commande ayant échoué fait partie du pipeline:
imprimera
printed
.Et seule la défaillance du pipeline lui-même est prise en compte:
n'imprimera rien.
La piste de commande qui a échoué dans la liste des composés suivant la
while
,until
,if
,elif
mot réservé, un pipeline en commençant par le!
mot réservé, ou toute commande dans le cadre de la&&
ou||
liste , sauf la dernière:La dernière commande échoue toujours
set -e
affectée:Le sous-shell échoue dans une commande composée:
la source
echo "printed"
etecho "not_printed"
dans vos exemples (au lieu deecho 1
).set -e
provoque une sortie dans(false && true); echo not here
, mais pas dans{ false && true; }; echo here
, bien que YMMV avec différents shells et même différentes versions d'un même shell. Je ne toucherais passet -e
avec un poteau de barge et ferais une gestion correcte des erreurs à la place.ma conjecture est si-alors la condition dans son ensemble est évaluée à vrai.
j'ai essayé
qui donne
le code d'erreur est catch by if condition, donc bash ne déclenchera pas la fin de l'exécution.
la source
if ... fi