web-dev-qa-db-fra.com

Quelle est la différence entre un point-virgule et une double esperluette &&

Quelle est la différence entre

echo "Hello " ; echo "world"

et

echo "Hello " && echo "world"

Les deux semblent exécuter les deux commandes l'une après l'autre.

164
lindhe

echo "Hello " ; echo "world" signifie exécuter echo "world" quel que soit l'état de sortie de la commande précédente echo "Hello" c'est-à-dire echo "world" s'exécutera indépendamment du succès ou de l'échec de la commande echo "Hello".

Alors qu'en cas de echo "Hello " && echo "world", echo "world" ne fonctionnera que si la première commande (echo "Hello") est un succès (c.-à-d. le statut de sortie 0).

Les commandes suivantes donnent un exemple de la façon dont le shell gère les chaînes de commandes à l'aide des différents opérateurs:

$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$
194
heemayl

Chaque commande sous Linux renvoie un code de sortie lorsqu'elle a fini de s'exécuter. Le code de sortie est affecté à une variable spéciale ?, afin que vous puissiez facilement vérifier l'état de la dernière commande, par exemple par echo $?. Ceci est souvent utilisé dans les scripts. Si la commande se termine avec succès, elle renvoie un code de sortie 0, tandis qu'en cas d'erreur lors de l'exécution, l'état de sortie est différent de zéro. Voir l'exemple ci-dessous:

 $ echo "Bonjour" 
 Bonjour 
 $ echo $? 
 0 
 
 $ rm fichier-inexistant 
 rm: impossible de supprimer le "fichier inexistant": aucun fichier ou répertoire de ce type 
 $ echo $? 
 1 

Maintenant, cela nous amène à votre question. Le && est un opérateur spécial qui dit `` n'exécuter la commande suivante que si la commande précédente a réussi, c'est-à-dire renvoyée avec un code de sortie de zéro ''. Il existe également un opérateur inverse ||, qui n'exécute la commande suivante qu'en cas d'échec de la commande précédente, c'est-à-dire sortie avec une valeur non nulle. Voir l'exemple ci-dessous:

 $ echo "Bonjour" && echo "La commande précédente a réussi" 
 Bonjour 
 La commande précédente a réussi 
 
 $ rm fichier-inexistant && echo "Cela ne sera pas imprimé" 
 Rm: impossible de supprimer le "fichier non existant": Aucun fichier ou répertoire de ce type 
 
 $ Rm fichier non existant || echo "Mais ceci sera affiché" 
 rm: ne peut pas supprimer ‘fichier-inexistant’: Aucun fichier ou répertoire 
 Mais cela sera affiché 

EDIT: La qustion concernait la différence entre && et ; donc pour que ce soit une réponse complète, je dois ajouter qu'un point-virgule divise simplement une commande d'une autre. Aucune vérification du code de sortie n'a lieu, donc si vous avez plusieurs commandes séparées par des points-virgules, elles sont simplement exécutées séquentiellement, c'est-à-dire l'une après l'autre, complètement indépendamment les unes des autres.

15
Erathiel

En plus de @ réponse de heemayl , && (et aussi ||) aura pour conséquence que le Shell ne traitera qu'un code de sortie unique pour toutes les commandes chaînées. Donc, si vous avez un trap [...] ERR ou set -o errexit line il traitera toutes les commandes avant de faire la gestion du code de sortie.

8
l0b0