web-dev-qa-db-fra.com

Quel est le but de "&&" dans une commande Shell?

Autant que je sache, utiliser & après la commande permet de l'exécuter en arrière-plan.

Exemple d'utilisation de &: tar -czf file.tar.gz dirname &

Mais qu'en est-il de &&? (Regardez cet exemple: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

324
Captain

&& vous permet de faire quelque chose en fonction de la réussite de la commande précédente - c'est pourquoi vous avez tendance à la voir chaînée en tant que do_something && do_something_else_that_depended_on_something.

368
girasquid

De plus, vous avez également || qui est le ou logique, et aussi ; qui est juste un séparateur qui ne tient pas compte de ce qui est arrivé à la commande auparavant.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

Quelques détails à ce sujet peuvent être trouvés ici Listes de commandes dans le manuel de Bash.

354
plundra

ligne de commande - quel est le but de &&?

Dans Shell, quand tu vois

$ command one && command two

l'intention est d'exécuter la commande qui suit le && que si la première commande est réussie. Ceci est idiomatique des coquilles Posix, et pas seulement dans Bash.

Il a l'intention d'empêcher l'exécution du deuxième processus si le premier échoue.

Les processus renvoient 0 pour vrai, d'autres nombres positifs pour faux

Les programmes renvoient un signal à la sortie. Ils doivent retourner 0 s'ils sortent avec succès, ou plus grand que 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 posix shell , qui fait partie d'une and_or liste de commandes, qui incluez également le || qui est un OR_IF avec une sémantique similaire.

Symboles de grammaire:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

Grammaire:

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 de gauche associative). Par exemple, les éléments suivants:

$ false && echo foo || echo bar
$ true || echo foo && echo bar

les deux ne font qu'écho bar.

  1. Dans le premier cas, la valeur false est une commande qui se termine avec le statut 1

    $ false
    $ echo $?
    1
    

    ce qui signifie echo foo ne s'exécute pas (c'est-à-dire, court-circuitant echo foo). Ensuite, la commande echo bar est exécutée.

  2. Dans le second cas, true se termine avec le code 0

    $ true
    $ echo $?
    0
    

    et donc echo foo n'est pas exécuté, alors echo bar est exécuté.

93
Aaron Hall

Un usage assez courant pour '&&' est la compilation de logiciels avec autotools. Par exemple:

./configure --prefix=/usr && make && Sudo make install

Fondamentalement, si la configuration réussit, make est exécuté pour la compilation et, si cela réussit, est exécuté en tant que root pour installer le programme. J'utilise ceci quand je suis surtout sûr que les choses vont fonctionner, et cela me permet de faire d'autres choses importantes comme regarder le stackoverflow et ne pas "surveiller" la progression.

Parfois, je suis vraiment emporté ...

tar xf package.tar.gz && ( cd package; ./configure && make && Sudo make install ) && rm package -rf

Je fais cela quand, par exemple, faire un Linux à partir de zéro.

31
Nigel Atkinson

&& chaîne des commandes ensemble. Les commandes successives ne sont exécutées que si les précédentes réussissent.

De même, || permettra l'exécution de la commande suivante si la précédente échoue.

Voir Programmation Shell Bash .

18
Dean Burge

Voir l'exemple:

mkdir test && echo "Something" > test/file

Shell essaiera de créer le répertoire test puis, niquement s’il a réussi essaie de créer un fichier à l’intérieur.

Vous pouvez donc interrompre une séquence d'étapes si l'une d'entre elles a échoué.

8
alno

command_1 && command_2: exécute la commande_2 uniquement lorsque la commande_1 est exécutée avec succès.

command_1 || command_2: exécute la commande_2 uniquement lorsque la commande_1 n'a pas été exécutée avec succès.

Ressemble à la façon dont une condition 'if' est exécutée dans un langage de programmation traditionnel, comme dans if (condition_1 && condition_2){...} la condition_2 sera omise si la condition_1 est false et dans if (condition_1 || condition_2){...} la condition_2 sera omise si la condition_1 est true. Vous voyez, c'est le même truc que vous utilisez pour le codage :)

7
Xiaonin Li

C'est pour exécuter une deuxième instruction si la première instruction se termine avec succès. Comme une déclaration if:

 if (1 == 1 && 2 == 2)
  echo "test;"

Son premier essai si 1 == 1, si c'est vrai, il vérifie si 2 == 2

6
Nick