web-dev-qa-db-fra.com

Comment exécuter plusieurs commandes en arrière-plan dans bash sur une seule ligne?

Je lance normalement plusieurs commandes avec quelque chose comme ceci:

sleep 2 && sleep 3

ou

sleep 2 ; sleep 3

mais que faire si je veux les exécuter tous les deux en arrière-plan à partir d'une commande en ligne de commande?

sleep 2 & && sleep 3 &

ne fonctionne pas. Et ne remplace pas non plus && par ;

Y a-t-il un moyen de le faire?

128
Palace Chan

Comment voulez-vous qu'ils fonctionnent? Si vous voulez qu’ils soient démarrés en arrière-plan et que vous exécutiez séquentiellement, procédez comme suit:

(sleep 2; sleep 3) &

Si, par contre, vous souhaitez qu'ils s'exécutent en arrière-plan dans parallel, vous pouvez le faire à la place:

sleep 2 & sleep 3 &

Et les deux techniques pourraient être combinées, telles que:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

Bash étant bash, il y a souvent une multitude de techniques différentes pour accomplir la même tâche, bien que parfois avec des différences subtiles entre elles.

226
Kitsune

Vous devez ajouter des parens dans votre dernière version -

(sleep 2 &) && (sleep 3 &)

ou cela fonctionne aussi - 

(sleep 2 &) ; (sleep 3 &)
40
iagreen

pour exécuter plusieurs commandes en arrière-plan, vous devez ajouter & fin de chaque commande . ex: (command1 &) && (command2 &) && (command3 &)

7
saeed

Les réponses ci-dessus utilisent des parenthèses. Bash peut également utiliser des accolades dans un but similaire:

{ sleep 2 && sleep 3; } &

Notez que les accolades sont plus difficiles en ce qui concerne la syntaxe - l'espace après {, l'espace avant } et le point-virgule final sont obligatoires. Dans certaines situations, les accolades sont plus efficaces car elles ne créent pas de nouveau sous-shell. Dans ce cas, je ne sais pas si cela fait une différence.

5
Greg Reagle

Cela marche:

$(sleep 2 &) && sleep 3 &

Aussi, vous pouvez faire:

$(sleep 2 && sleep 3) &
4
higuaro

J'ai aussi la même mission . J'ai essayé (sleep2 ; fg )& sleep3 ; fg, ça marche . Et quand vous pressez ctrl + c en double, les deux processus peuvent être arrêtés.

0
dingyang wang

Si vous voulez exécuter plusieurs commandes séquentiellement , il existe une méthode très simple qui fonctionne partout: Créer un fichier! L'avantage de cette méthode est qu'elle est propre et simple.

Commencez par créer votre fichier avec un nom, par exemple commands.sh. Ensuite, mettez vos commandes là-bas. Voici un exemple:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

OK, maintenant nous sommes dans la dernière étape. Pour exécuter des commandes en arrière-plan (séquentiellement), exécutez simplement:

$ sh commands.sh &
0
MAChitgarha