Quelle est la différence entre “commande && commande” et “commande; commander"

49

Je vois ces deux utilisations sur Ubuntu "commande && commande" et "commande; commande",
par exempleapt-get update && apt-get upgrade

Qu'est-ce qui différerait si j'utilise apt-get update; apt-get upgrade?
Je ne demande pas cet usage spécifique, mais en général, quelle est la différence entre ces deux usages?

maux de tête
la source
2
Commande en ligne Win et le lot ont la même fonction: & (simple sequencing), && (conditional AND) and || (conditional OR).
Karan
5
Voir aussi: Manuel de référence Bash - Liste des commandes . En général, rien ne se trouve dans la documentation. Cela vaut vraiment la peine de regarder si vous avez une question sur des éléments de syntaxe spécifiques.
Slhck
1
@Karan Et pour être complet, bash (linux / Ubuntu) l’a ||également.
Izkata

Réponses:

88

&&est un opérateur logique. ;est un séquençage simple.

Dans cmd1 && cmd2, cmd2 ne sera exécuté que si cmd1 se ferme avec un code retour réussi.

Alors que in cmd1; cmd2, cmd2 s'exécutera quel que soit le statut de sortie de cmd1 (en supposant que vous n'avez pas configuré votre shell pour qu'il se ferme en cas d'échec de votre script ou de quelque chose).

Sur une note connexe, avec cmd1 || cmd2l' ||opérateur logique "OU", cmd2 ne sera exécuté que si cmd1 échoue (retourne un code de sortie non nul).

Ces opérateurs logiques sont parfois utilisés dans des scripts à la place d'une instruction if de base. Par exemple,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... peut être réalisé de manière plus concise avec:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
Etan Reisner
la source
Je trouve cela un peu fallacieux car, à ma connaissance, code de retour réussi signifie 0, ce qui, une fois transformé en bool, donne une fausse logique. Donc, suivant la philosophie de l’évaluation de Mccarthy utilisée dans la plupart des langues, il devrait immédiatement renvoyer faux plutôt que d’évaluer la prochaine instruction.
Della
33

Syntaxe

command1 && command2

commande2 est exécutée si, et seulement si,command1renvoie un état de sortie égal à zéro ( vrai ). En d'autres termes, exécutezcommand1et si c'est réussi, alors exécutezcommand2.

command1 ; command2

Les deux commande1 et commande2 seront exécutées indépendamment. Le point-virgule vous permet de saisir plusieurs commandes sur une seule ligne.

Connexes :

command1 || command2

commande2 est exécutée si, et seulement si, commande1 renvoie un état de sortie non nul. En d'autres termes, exécutezcommand1avec succès ou exécutezcommand2.


Exemple

&& opérateur:

$ rm /tmp/filename && echo "File deleted"

; opérateur:

$ echo "foo" ; echo "bar"

|| opérateur:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

Liens externes

  1. Linuxtopia.org
  2. Tldp.org
stderr
la source