&
exécute une commande en arrière-plan et renverra 0 quel que soit son statut.
À partir de la page de manuel :
Si une commande est terminée par l'opérateur de contrôle &, le shell exécute la commande en arrière-plan dans un sous-shell. Le shell n'attend pas que la commande se termine et l'état de retour est 0. Commandes séparées par un; sont exécutés séquentiellement ; le shell attend que chaque commande se termine à son tour. L'état de retour est l'état de sortie de la dernière commande exécutée.
Regardez quelles sont vos commandes :
test -x examples.desktop && echo $?
Cela signifie vérifier si examples.desktop
est exécutable et si c'est le cas, exécutez echo $?
.
test -x examples.desktop & echo $?
signifie vérifier si examples.desktop
est exécutable en "arrière-plan". Puis exécutez echo $?
.
La signification de &&
et &
sont intrinsèquement différents.
- Qu'est-ce que
&&
? dans Bash ? Dans Bash—et de nombreux autres langages de programmation—&&
signifie « ET ». Et dans un contexte d'exécution de commande comme celui-ci, cela signifie des éléments à gauche ainsi qu'à droite de&&
doivent être exécutés dans l'ordre dans ce cas. - Qu'est-ce que
&
dans Bash ? Et un seul&
signifie que les commandes précédentes—immédiatement à gauche du&
— doit simplement être exécuté en arrière-plan.
Donc, en regardant votre exemple :
[email protected]:~$ test -x examples.desktop && echo $?
[email protected]:~$ test -x examples.desktop & echo $?
[1] 2992
0
La première commande, telle qu'elle est structurée, ne renvoie en fait rien. Mais la deuxième commande renvoie un [1] 2992
dans lequel le 2992
fait référence à l'ID de processus (PID) qui s'exécute en arrière-plan et au 0
est la sortie de la première commande.
Étant donné que la deuxième commande exécute simplement test -x examples.desktop
en arrière-plan, cela se produit assez rapidement, de sorte que l'ID de processus est généré et disparaît assez immédiatement.