web-dev-qa-db-fra.com

Lequel est le meilleur: utiliser; ou && pour exécuter plusieurs commandes sur une seule ligne?

Dans les tutoriels et les procédures, je vois souvent des commandes combinées. Par exemple,

Sudo apt-get update && Sudo apt-get install pyrenamer

Il semble y avoir quatre connecteurs possibles: &, &&, || et ;. Bien que le connecteur & me soit clair (il envoie un processus à l’arrière-plan et laisse le terminal disponible), la différence entre && et ; n’est pas claire. Et je ne connaissais pas || jusqu'au commentaire de Kaya.

Les questions suivantes traitent de la différence entre les deux connecteurs, mais le font principalement dans les commentaires:

Donc, voici un certain nombre de questions connexes:

  1. Quelle est la différence entre ; et &&?
  2. Quand devriez-vous les utiliser respectivement? Il serait bien de voir quelques cas d'utilisation: si je veux exécuter une commande puis éteindre mon ordinateur, quel connecteur devrais-je choisir?
  3. Quels sont leurs avantages et dangers ? Robie Basak mentionne dans un commentaire cette réponse qu'une commande telle que cd /somewhere_else; rm -Rf * peut avoir des conséquences destructives si le premier élément de la chaîne de commande échoue, par exemple.
  4. Si pertinent, d'où viennent-ils?
407
don.joey

Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.
726
Jack

&& n'exécute la deuxième commande que si la première est sortie avec le statut 0 (a réussi). ; exécute les deux commandes, même si la première sort avec un statut différent de zéro.

Votre exemple avec && peut être paraphrasé de la manière suivante:

if Sudo apt-get update ; then
    Sudo apt-get install pyrenamer
fi
77
choroba

Utiliser ; exécutera les commandes, que la première commande soit réussie ou non.

en utilisant && exécuter la 2e commande uniquement lorsque la première commande a été exécutée avec succès (état 0).

Les deux sont utilisés sur des perspectives différentes. Comme pour un processus plus long, disons que pour une installation, vous devez le compiler et l'installer. vous devriez make && make install. L'installation ne sera donc exécutée que si make a réussi.

Donc, pour les commandes dépendantes, vous devriez utiliser &&

Wring bash ou les commandes avec des commandes indépendantes utilisent ;

Donc, si vous voulez éteindre l'ordinateur, même si le premier travail a échoué, utilisez ;, mais si vous voulez que le premier travail soit un succès complet, lancez l'arrêt, utilisez &&.

30
Web-E

a ; b s'exécutera b quel que soit le statut de sortie de a. a && b ne fonctionnera b que si a réussi.

Ceci est nécessaire et suffisant pour répondre aux 3 premières questions. En particulier, le 2 est trop large et ne peut pas donner "une" réponse définitive - votre meilleur pari est de décider au cas par cas.

En ce qui concerne la 4ème question: syntaxe Bash .

Il n'y a pas de danger intrinsèque à utiliser non plus. Encore une fois, la définition ci-dessus est suffisante. Cela implique que vous écriviez && lorsque b a des effets inattendus si a n'aboutit pas. Il n'y a pas besoin de règles supplémentaires ou d'explication, à mon humble avis.

13
ignis