ligne de commande - quel est le but de &&
?
En coquille, quand vous voyez
$ command one && command two
l'intention est d'exécuter la commande qui suit &&
uniquement si la première commande réussit. C'est idiomatique des coquilles Posix, et pas seulement dans Bash.
Il vise à empêcher l'exécution du deuxième processus si le premier échoue.
Vous remarquerez peut-être que j'ai utilisé le mot «intention» - c'est pour une bonne raison. Tous les programmes n'ont pas le même comportement, donc pour que cela fonctionne, vous devez comprendre ce que le programme considère comme un "échec" et comment il le gère en lisant la documentation et, si nécessaire, le code source.
Votre shell considère une valeur de retour de 0 pour true, d'autres nombres positifs pour false
Les programmes renvoient un signal à la sortie. Ils doivent retourner 0 s'ils sortent avec succès, ou supérieur à zéro s'ils ne le font pas. Cela permet une quantité limitée de communication entre les processus.
Le &&
est appelé AND_IF
dans la grammaire du shell posix , qui fait partie d'une and_or
liste de commandes, qui incluent également le ||
qui est un OR_IF
avec une sémantique similaire.
Symboles de grammaire, cités dans la documentation:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
Et la grammaire (également citée dans la documentation), qui montre que n'importe quel nombre de AND_IF
s ( &&
) et / ou OR_IF
s ( ||
) peut être enchaîné (comme and_or
défini de manière récursive):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Les deux opérateurs ont la même priorité et sont évalués de gauche à droite (ils sont associatifs à gauche). Comme le disent les docs:
Une AND-OR
liste est une séquence d'un ou plusieurs pipelines séparés par les opérateurs "&&"
et "||"
.
Une liste est une séquence d'un ou plusieurs ET-OU listes séparées par les opérateurs ';'
et '&'
et éventuellement terminé par ';'
, '&'
ou.
Les opérateurs "&&"
et "||"
ont même priorité et doivent être évalués avec associativité à gauche. Par exemple, les deux commandes suivantes écrivent uniquement la barre sur la sortie standard:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
Dans le premier cas, le faux est une commande qui se termine avec le statut 1
$ false
$ echo $?
1
ce qui signifie echo foo
ne fonctionne pas (c'est-à-dire court-circuitage echo foo
). Ensuite, la commande echo bar
est exécutée.
Dans le second cas, les vraies sorties avec un code de 0
$ true
$ echo $?
0
et echo foo
n'est donc pas exécuté, puis echo bar
est exécuté.
false && echo "Will not be printed"
.