577 votes

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

Dans les tutoriels et les didacticiels, 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 en arrière-plan et laisse le terminal disponible), il n'est pas clair quelle est la différence entre && et ;. Et je ne connaissais pas || avant le commentaire de Kaya.

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

Voici donc plusieurs questions connexes :

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

7voto

chicks Points 534

Bravo à la feuille de triche de Jack pour expliquer clairement et succinctement comment cela fonctionne. Mais toutes ces choses ont une raison plus générale d'être choisies. Vous n'avez pas juste à mémoriser ces faits pour lorsque vous travaillez dans le terminal. Pour plus de contexte, vous aimeriez peut-être savoir que :

  • ; est couramment utilisé comme séparateur d'instructions dans des langages comme C, C ++, Perl, Java, C #, awk, et une série de langages dérivés de ceux-ci. Il remplit la même fonction dans tous ceux-ci : faire une chose, puis la suivante. C'est comme un point à la fin d'une phrase.
  • & est utilisé en C pour le ET par bits donc && est utilisé pour le ET logique. Le ET logique en C inclut une fonctionnalité appelée shortcutting. Shortcutting signifie que pour un ET si la première chose est fausse, il n'y a pas de raison de vérifier la deuxième chose. Un seul élément faux dans un ET signifie que le tout sera faux. Dans le terminal, cela signifie qu'il ne passera pas à la deuxième commande si la première a échoué. Ou si la première chose a fonctionné, il passera à la deuxième pour voir si elle "pourrait être fausse".
  • | est utilisé en C pour le OU par bits donc || est utilisé pour le OU logique. Les OU logiques ont également une fonctionnalité de shortcutting. Dans un OU cela signifie que vous recherchez la première chose vraie. Donc si la première chose échoue, il essaiera la deuxième chose.

3voto

Les autres l'ont bien dit. D'un point de vue pratique, je trouve souvent que si vous voulez enchaîner des commandes alors vous aimeriez savoir où quelque chose échoue aussi. Pour cela, vous devez comprendre le regroupement dans les commandes bash en utilisant les crochets courbes.

Au lieu de a && b vous voudrez écrire:

a || { echo "a a échoué" && false; } && b || echo "b a échoué"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X