web-dev-qa-db-fra.com

Bash / sh - différence entre && et;

J'utilise normalement ; Pour combiner plusieurs commandes dans une ligne, mais certaines personnes préfèrent &&. Y a-t-il une différence? Par exemple, cd ~; cd - Et cd ~ && cd - Semblent faire la même chose. Quelle version est la plus portable, par exemple sera pris en charge par un sous-ensemble bash comme le shell d'Android ou autre?

118
psihodelia

Si la commande précédente a échoué avec ; le second fonctionnera.

Mais avec && le second ne fonctionnera pas.

Ceci est un opérande "ET" logique "paresseux" entre les opérations.

172
ignar

J'utilise && _ car il y a longtemps sur l'ordinateur voisin:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

mais pas aidé ...;)

cd /tnp/test && rm -rf * est sécurisé... ;)

52
jm666

Dans cmd1 && cmd2, cmd2 n'est exécuté que si cmd1 réussit (renvoie 0).

Dans cmd1 ; cmd2, cmd2 est exécuté dans tous les cas.

Les deux constructions font partie d'un shell compatible POSIX.

20
Pascal Cuoq

&& signifie exécuter la commande suivante si la précédente est sortie avec le statut 0. Au contraire, utilisez || c’est-à-dire à exécuter si la commande précédente se termine avec un statut différent de 0 ; exécute toujours.

Très utile lorsque vous devez effectuer une action particulière selon que la commande précédente se termine correctement ou non.

8
Fredrik Pihl

Les commandes sont séparées par ; sont exécutés de manière séquentielle, quel que soit leur statut d'achèvement.

Avec &&, la deuxième commande n'est exécutée que si la première aboutit (retourne l'état de sortie à 0).

Ceci est couvert dans la page de manuel bash sous Lists. Je m'attendrais à ce qu'un shell de type Unix supporte ces deux opérateurs, mais je ne connais pas spécifiquement le shell Android Shell.

5
Dave Costa

&& permet une exécution conditionnelle tandis que ; a toujours la deuxième commande en cours d'exécution.

Dans par exemple command1 && command2, command2 ne s’exécutera que lorsque command1 a terminé avec exit 0, signalant que tout s'est bien passé, alors que dans command1 ; command2 la deuxième commande sera toujours exécutée quel que soit le résultat de command1.

3
Marcel

&& est logique ET en bash. Bash a une évaluation de court-circuit de ET logique. Cet idiome est un moyen plus simple d’exprimer ce qui suit:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

Tandis que le ; la version est simplement:


cmd1
cmd2
1
frankc