Quelle est la différence entre la double esperluette (&&) et le point-virgule (;) dans Linux Bash?

112

Quelle est la différence entre l'esperluette et le point-virgule dans Linux Bash ?

Par exemple,

$ command1 && command2

contre

$ command1; command2
Steve K
la source
6
J'ai répondu à ceci ici: superuser.com/a/619019/107862
Etan Reisner
9
En ce qui concerne le hors-sujet, la dernière fois que j'ai vérifié, bash était toujours un langage de programmation, mais je me suis trompé avant et cela pourrait être des bonbons aux fruits secs.
Steve K
C'est le cas, et si vous posiez une question sur un comportement spécifique ou sur la bonne façon de faire une certaine chose, ce serait certainement sur le sujet. Cela tombe dans une catégorie plus grise de «question sur la syntaxe d'un langage» qui n'est pas aussi clairement une question de «programmation» en ce qui me concerne.
Etan Reisner
4
bash est à certains égards sec et à certains égards sucré. En fin de compte, c'est assez agréable et digeste. Il ne peut cependant pas être facilement volé aux bébés.
code_monk

Réponses:

139

L' &&opérateur est un opérateur ET booléen: si le côté gauche renvoie un état de sortie différent de zéro, l'opérateur renvoie cet état et n'évalue pas le côté droit (il court-circuite), sinon il évalue le côté droit et renvoie son état de sortie . Ceci est couramment utilisé pour s'assurer qu'il command2n'est exécuté que s'il est command1exécuté avec succès.

Le ;jeton sépare simplement les commandes, il exécutera donc la deuxième commande, que la première réussisse ou non.

cdhowie
la source
6
la double esperluette est-elle &&différente d'une esperluette simple &dans bash?
Charlie Parker
16
@CharlieParker &provoque l' exécution de la commande en arrière-plan, donc oui. «Exécuter ceci en arrière-plan» est très différent de «exécuter cette commande suivante uniquement si celle-ci réussit».
cdhowie
La commande2 exécutera uniquement la commande1 a renvoyé l' état de sortie zéro , ce qui signifie qu'elle s'est terminée avec succès ..
Nik
;Attend- il toujours la fin de la première commande?
rfii il y a
@rfii Oui, mais il exécute la deuxième commande sans se soucier de savoir si la première commande a réussi. a;bsignifie «courir apuis courir b». a&&bsignifie "exécuter a, puis exécuter buniquement si cela aa réussi."
cdhowie
33

commande1 && commande2

command1 && command2s'exécute command2si (et seulement si) l' command1exécution se termine avec succès. Dans le jargon Unix, cela signifie un code de sortie / code de retour égal à zéro.

command1; commande2

command1; command2s'exécute command2après exécution command1, séquentiellement. Peu importe que les commandes aient réussi ou non.

jimm-cl
la source
6

Le premier est une logique simple ANDutilisant l'évaluation des courts-circuits, le second délimite simplement deux commandes.

Ce qui se passe en réalité, c'est que lorsque le premier programme renvoie un code de sortie différent de zéro, le tout ANDest évalué FALSEet la deuxième commande ne sera pas exécutée. Ce dernier les exécute simplement tous les deux dans l'ordre.

Danstahr
la source