Quelle est la différence entre && et; en forçant le sommeil à l'arrière-plan?

8

Je viens de poser une question sur la mise en place d'un processus pour dormir dans le fond.
La notation que j'ai trouvée me ressemble à ceci:

sleep 10 && echo "hello world" &

Cette réponse à une autre question utilise un format différent.

( sleep 10 ; echo "hello world" ) &

Je sais que cela &&ne permet au deuxième processus de démarrer que si le premier retourne vrai. Le sommeil peut-il échouer? Y a-t-il une situation où je devrais préférer l'un à l'autre?

Baarn
la source

Réponses:

12

Le sommeil peut échouer s'il est interrompu pendant l'exécution:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

Puisque sleep est un exécutable externe, il est également concevable que les appels fork ou exec puissent échouer, ce qui entraînerait également que bash génère un code d'erreur> 0.

Chris Down
la source
5

a; bexécute toujours la deuxième commande après la première, alors qu'elle a && bn'exécute la deuxième commande que si la première réussit, c'est-à-dire uniquement si la première commande renvoie l'état 0.

sleeprenvoie toujours l'état 0, sauf lorsqu'il est tué par un signal, auquel cas l'état est 128 + numéro de signal. (Le statut peut également être 126 ou 127 si la sleepcommande n'existe pas ou si le programme ne peut pas démarrer en raison d'un manque de ressources, mais il est très peu probable que vous rencontriez ces cas.)

Ainsi, vous devez utiliser ;ou &&selon ce que vous voulez arriver si le sommeil est interrompu:

  • sleep 10; echo helloimprime le message après 10 secondes (moins s'il sleepest tué par un signal);
  • sleep 10 && echo helloimprime le message après 10 secondes, mais n'imprime rien s'il sleepest tué par un signal.
Gilles 'SO- arrête d'être méchant'
la source
3

Vous devez supposer que toute commande peut échouer pour diverses raisons, même si l'échec du sommeil est en effet très improbable.

( sleep 10 ; echo "hello world" ) &

signifie sommeil en arrière-plan et exécuter l'écho après le processus de sommeil, mais si le sommeil échoue, l'écho s'exécutera quand même voir l'explication complète

sleep 10 && echo "hello world" &

signifie que vous devez attendre la fin du sommeil avant de faire écho à quoi que ce soit et si écho échoue, le processus s'arrête mais la commande entière est également en arrière-plan. voir l'explication complète

Conclusion
la première syntaxe est le script shell ce qui signifie qu'il considère les instructions séparément comme une liste.
La deuxième option utilise && signifie ET donc si vous l'utilisez si la première commande échoue, la seconde ne sera pas exécutée.

Il s'agit simplement d'un comportement différent dans la gestion des erreurs.

Kiwy
la source
@terdon Merci pour la modification, mon message a en effet été terriblement écrit
Kiwy