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

136

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

psihodelia
la source

Réponses:

193

Si la commande précédente a échoué, ;la seconde sera exécutée.

Mais avec &&le second ne fonctionnera pas.

Il s'agit d'un opérande "AND" logique "paresseux" entre les opérations.

ignorer
la source
2
En d'autres termes, il a un comportement de court-circuit
peterchaula
@peter Lequel? Celui ;ou &&celui? Ou voulez-vous dire les deux?
Shayan
@Shayan, le &&.
peterchaula
57

J'utilise &&car il y a longtemps sur l'ordinateur à proximité:

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é... ;)

jm666
la source
26
Pour être plus sûr, j'utiliseraisrm -rf /tnp/test
melvynkim
5
Pour être encore plus sûr, il est préférable de l'utiliser rm /tnp/test/ -rfpour éviter un mauvais
clic
22

In cmd1 && cmd2, cmd2n'est exécuté qu'en cas de cmd1succès (renvoie 0).

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

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

Pascal Cuoq
la source
11

&&signifie exécuter la commande suivante si la précédente est sortie avec l'état 0. Pour le contraire, utilisez ||ie pour être exécutée si la commande précédente sort avec un état différent de 0 ;s'exécute toujours.

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

Fredrik Pihl
la source
5

Les commandes séparées par ;sont exécutées séquentiellement quel que soit leur état d'achèvement.

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

Ceci est couvert dans la page de manuel bash ci-dessous Lists. Je m'attendrais à ce que n'importe quel shell de type Unix supporte ces deux opérateurs, mais je ne connais pas spécifiquement le shell Android.

Dave Costa
la source
2
Voici un lien vers le manuel bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
3

&&permet une exécution conditionnelle tandis que ;la deuxième commande est toujours exécutée.

Dans par exemple command1 && command2, command2ne s'exécutera que lorsque command1s'est terminé par exit 0, signalant que tout s'est bien passé, tandis que dans command1 ; command2la deuxième commande sera toujours exécutée quel que soit le résultat command1.

Marcel
la source
1

&& est un ET logique dans bash. Bash a une évaluation de court-circuit du ET logique. Cet idiome est une manière 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
Frankc
la source