GNU/Linux >> Tutoriels Linux >  >> Linux

Le script Bash avec `set -e` ne s'arrête pas sur la commande `… &&…` ?

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 un while ou until mot-clé,
partie du test suivant le if ou elif 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 le while , until ,if , ou elif 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 “|| ".


Linux
  1. Dans un script bash, comment la commande Continuer fonctionne-t-elle avec les boucles intégrées ?

  2. Impossible d'arrêter un script Bash avec Ctrl+c ?

  3. Vérifiez combien de temps un script bash prend pour s'exécuter avec la commande Time

  4. Est-il possible de faire interagir un script shell bash avec un autre programme en ligne de commande ?

  5. Ubuntu - Exécuter la commande au démarrage avec sudo

Automatisez le traitement des images avec ce script Bash

Comment écrire un script bash avec des exemples

Tutoriel Bash HereDoc avec exemples

Commande de mise en veille Linux (Pause d'un script Bash)

La commande Bash Echo expliquée avec des exemples sous Linux

Bash Scripting - Commande Printf expliquée avec des exemples