Comment peut-on exécuter plusieurs programmes en arrière-plan avec une seule commande?

36

Comment peut-on exécuter plusieurs programmes en arrière-plan avec une seule commande?

J'ai essayé les commandes ci-dessous, mais elles ne fonctionnent pas.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'
Rahul Patil
la source
qu'est-ce qu'une seule "commande"? Une ligne de bash?
Oluf Lorenzen
1
stackoverflow.com/questions/14612371/…
Ciro Santilli a dévoilé
Il se peut que je manque quelque chose d’évident, mais && implique de connaître le code de sortie de la commande précédente. Si vous l’arrière-plan, le code de sortie ne sera pas connu. Quel était le besoin fonctionnel là-bas?
Richlv

Réponses:

32

Du point de vue de la syntaxe du shell, &sépare les commandes telles que ;/ |/ &&... (bien que, bien sûr, avec une sémantique différente). Donc c'est juste:

cmd1 & cmd2 & cmd3 &
Stéphane Chazelas
la source
1
ce n'est pas / tout à fait / bien, ;lance la commande suivante dès que la première est terminée. &met effectivement la commande en arrière-plan. juste essayer ceci:echo foo & echo bar & echo test &
Oluf Lorenzen
1
@Finkregh, bien sûr. Personne n'en doute. Je voulais juste dire que les deux commandes sont séparées (du point de vue de la syntaxe) sans aucune implication sur la façon dont elles sont exécutées.
Stéphane Chazelas
Ce n'est pas tout à fait ce qui a été demandé, puisque la question spécifiait l'émission d'une "commande unique". Ma réponse n’est pas non plus, car c’est aussi une série de commandes, mais elle a au moins une sémantique d’une commande unique dans laquelle la sortie est concaténée, peut être redirigée, etc.
Eli Heady
"Commandes multiples avec une seule commande" semble être un oxymore, cependant - qu'est-ce que cela signifie? Si c'est pour quelque chose comme sudoça, vous pouvez entrer le mot de passe une seule fois, puis le boucler bash -cou similaire.
Richlv
12

La section de la page de manuel bash intitulée Compound Commands (Commandes composées) contient deux options qui fonctionnent: les commandes de liste et de groupe.

Une commande de groupe est une série de commandes entourées d'accolades {}. Une liste est la même, entre parenthèses (). Les deux peuvent être utilisés pour mettre en arrière-plan plusieurs commandes au sein de, et enfin pour mettre en arrière-plan la collection entière comme un ensemble. La structure de liste exécute des commandes dans un sous-shell, de sorte que les affectations de variables ne sont pas conservées.

Pour exécuter un groupe de commandes:

{ command1 & command2 & } &

Vous pouvez également exécuter vos commandes dans une liste (sous-shell):

( command1 & command2 ) &
Eli Heady
la source
1
De rien. J'ai ajouté le lien au manuel. Notez que la ()syntaxe de liste exécute les commandes incluses dans un sous-shell, ainsi les variables ne sont pas conservées.
Eli Heady
3

autrement:

$(command1 &) && command2 & 
Golfe Persique
la source
Non, il lancera la première commande, puis après la fin, il lancera une autre commande
Rahul Patil
vous avez utilisé &&dans votre question, cela signifie d'abord exécuter une commande, puis si exécuter avec succès, exécutez la commande suivante.Si vous ne le considérez pas, vous pouvez exécutercommand1 & ; command2 & ;
PersianGulf
La première commande passe avec succès en bg ou est exécutée ;sans problème
Rahul Patil