Existe-t-il une différence entre le fonctionnement de deux esperluettes et d'un point-virgule lors de bash?

71

Si je voulais exécuter deux commandes distinctes sur une ligne, je pouvais le faire:

cd /home; ls -al

ou ca:

cd /home && ls -al

Et j'obtiens les mêmes résultats. Cependant, que se passe-t-il en arrière-plan avec ces deux méthodes? Quelle est la différence fonctionnelle entre eux?

Sean P
la source

Réponses:

88

Le ;juste sépare une commande d'une autre. Le &&dit exécuter uniquement la commande suivante si la précédente a réussi

cd /home; ls -al

Cela va cd /homeet même si la cdcommande échoue ( /homen'existe pas, vous n'avez pas la permission de la parcourir, etc.), elle sera exécutée ls -al.

cd /home && ls -al

Cela ne fonctionnera que le ls -alsi le cd /homea réussi.

user9517 prend en charge GoFundMonica
la source
2
utiliser de ; est très dangereux (au moins avec la commande rm), par exemple cd /some/dir; rm -fr ./*. Donc, avec une telle opération destructive, vous devez être sûr d’être au bon endroit avant d’exécuter rm. La bonne commande estcd /some/dir && rm -fr ./*
ALex_hha
70
a && b

si a renvoie zéro code de sortie, alors b est exécuté.

a || b

si a renvoie un code de sortie non nul, b est exécuté.

a ; b

a est exécuté puis b est exécuté.

Minsuk Song
la source
16
cd /fakedir; ls -al

S'exécute lsdans le répertoire en cours car cd /fakediréchouera et le shell ignorera le statut de sortie différent de zéro.

cd /fakedir && ls -al

Etant donné que l' &&opérateur continuera uniquement si la commande précédente s'est terminée normalement (statut égal à zéro), aucune lsopération ne sera effectuée.

Il existe d'autres opérateurs, tels que ceux &qui fondent un processus. Bien que souvent placé à la fin d'une commande, il peut être placé au milieu d'une chaîne.

Jeff Ferland
la source
4

Vous pouvez également les associer comme une if..then..elselogique de commande d'enchaînement.

exemple:

ls file.ext && echo "file exists" || echo "file does not exist"
Mtl Dev
la source