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

326

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

Les questions suivantes traitent de la différence entre les deux connecteurs, mais faites-le surtout dans les commentaires:

Voici donc un certain nombre de questions connexes:

  1. Quelle est la différence entre ; et && ?
  2. Quand devez-vous les utiliser respectivement ? Ce serait bien de voir quelques cas d'utilisation: si je veux exécuter une commande et ensuite après avoir éteint 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 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. Le cas échéant, d'où viennent-ils?
posée don.joey 20.08.2013 - 18:41
la source

4 réponses

593

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.
    
réponse donnée Jack 20.10.2014 - 13:02
la source
77

&& exécute uniquement la deuxième commande si la première est sortie avec le statut 0 (a réussi). ; exécute les deux commandes, même si la première se ferme avec un statut non nul.

Votre exemple avec && peut être paraphrasé comme

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi
    
réponse donnée choroba 20.08.2013 - 18:46
la source
28

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

utiliser && exécuter la deuxième commande uniquement lorsque la première commande a été exécutée avec succès (état 0).

Les deux sont utilisés dans une perspective différente. Comme pour un processus plus long, par exemple, pour une installation, vous devez la compiler et l'installer. vous devriez make && make install . Donc, l'installation ne fonctionnera que si make a réussi.

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

Écriture de bash, ou des commandes avec des commandes indépendantes utilisent ;

Donc, si vous voulez arrêter l'ordinateur, même le premier travail a échoué, utilisez ; , mais si vous voulez que le premier travail réussisse, lancez l'arrêt &&

    
réponse donnée Web-E 20.08.2013 - 18:50
la source
13

a ; b exécutera b quel que soit le statut de sortie de a. a && b exécutera b uniquement si une réussite.

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

Quant à la 4ème question: Ils sont une syntaxe Bash .

Il n'y a pas de danger intrinsèque à utiliser l'un ou l'autre. Encore une fois, la définition ci-dessus est suffisante. Cela implique que vous allez écrire && lorsque b a des effets non intentionnels si a n'aboutit pas. Il n’ya pas besoin de règles ou d’explications supplémentaires, à mon humble avis.

    
réponse donnée ignis 20.08.2013 - 23:05
la source

Lire d'autres questions sur les étiquettes