Comment est-il possible d'exécuter plusieurs commandes et de les mettre en arrière-plan à l'aide de bash?
Par exemple:
$ for i in {1..10}; do wait file$i &; done
où wait est un binaire personnalisé.
En ce moment, je reçois une erreur:
syntax error near unexpected token `;'
lors de l'exécution de la commande ci-dessus.
Une fois en arrière-plan, les commandes doivent s'exécuter en parallèle.
nohup
vous permettant d'exécuter une commande en arrière&
et;
sont tous les deux des "terminateurs de commande". Vous n'avez pas besoin d'utiliser les deux:for ...; do wait $arg & done
fonctionnera.Réponses:
Le
&
, tout comme;
un opérateur de terminaison de liste . Ils ont la même syntaxe et peuvent être utilisés de manière interchangeable (selon ce que vous voulez faire). Cela signifie que vous ne voulez pas ou n'avez pas besoincommand1 &; command2
, tout ce dont vous avez besoin estcommand1 & command2
.Donc, dans votre exemple, vous pouvez simplement écrire:
et chaque
wait
commande sera lancée en arrière-plan et la boucle passera immédiatement à la suivante.la source
Pour des raisons de compatibilité, utilisez la forme posix au lieu de l'expansion:
la source
seq
n'est pas une commande POSIX et ne se trouve généralement que sur les systèmes GNU. Le comportement ou$(...)
(et$i
) dépend de la valeur actuelle de$IFS
. Notez également qu'en faisant(cmd &)
,cmd
sera un enfant d'un sous-shell, vous ne pourrez donc pas attendre et obtenir son état de sortie par exemple.Vous pouvez regrouper les commandes et mettre les commandes groupées en arrière-plan. Comme :
la source
Votre binaire est-il vraiment nommé
wait
? Je ne recommande pas de le faire, car ilwait
s'agit d'un shell intégré.Je crois que bash n'analyse pas bien une boucle d'une ligne qui lance des processus d'arrière-plan. Je vous suggère de changer le code en:
la source