J'ai rencontré un problème de maux de tête.
Je veux exécuter plusieurs commandes en arrière-plan, donc je veux les lancer en bash un par un. Il est facile de démarrer une commande dans le shell Linux en arrière-plan, comme ceci:
myCommand &
Il est également facile de démarrer plusieurs commandes, comme ceci:
myCommand1 && myCommand2
ou
myCommand1 ; myCommand2
Mais si je veux exécuter plusieurs commandes en arrière-plan, j'ai essayé le format de commande suivant, mais j'ai échoué:
myCommand1 & && myCommand2 &
ou
myCommand1 & ; myCommand2 &
Les deux formats échouent. Comment puis-je exécuter plusieurs commandes qui ont &
dans une seule ligne de commande?
command-line
bash
Horloge ZHONG
la source
la source
Réponses:
Utilisation ().
Si vous souhaitez les exécuter séquentiellement:
ou
Si vous souhaitez qu'ils fonctionnent en parallèle:
En bash, vous pouvez également utiliser ceci (les espaces derrière les {et les; sont obligatoires):
la source
(myCommand1 &) && (myCommand2 &)
s'exécuteramyCommand2
même en cas d'myCommand1
échec.Je suppose que tu veux ça:
Cela démarre
myCommand1
et l'envoie à l'arrière-plan, suivi par l'esperluette, puis démarre immédiatementmyCommand2
et envoie également cela à l'arrière-plan, libérant ainsi à nouveau le shell.Listes
Pour une meilleure compréhension, vous pouvez remplacer le pipeline par commande ici.
Décomposons cela en exemples. Vous pouvez créer une liste en combinant des commandes et en les séparant par l'une des suivantes
; & && ||
:Vous pouvez mettre fin à des listes avec l'une des options suivantes
; & <newline>
:.Normalement, vous exécutez une commande ou une liste en appuyant sur Enter, cela équivaut à
<newline>
. Le point-virgule;
remplit la même fonction, en particulier dans les scripts. Esperluette&
démarre cependant la ou les commandes dans un sous-shell en arrière-plan, libérant immédiatement le shell.Vous pouvez utiliser
()
des crochets ronds ou bouclés{}
pour créer d'autres listes de groupes, la différence étant que les crochets ronds génèrent un sous-shell et les bouclés non. Les accolades ont besoin d'un espace après le premier et d'un point-virgule ou d'un retour à la ligne avant le crochet de fermeture. Par exemple:Cela peut devenir assez compliqué, si vous n'êtes pas sûr de l'utilisation
true
etfalse
pour tester si la construction fonctionne comme prévu:Contrôle des travaux
La
jobs
commande affiche une liste des tâches d'arrière-plan en cours d'exécution ou récemment terminées dans le shell actuel. Il existe un certain nombre de raccourcis clavier et de commandes pour le contrôle des travaux:jobs
listefg
=%
met un processus au premier plan en le démarrant si nécessaire, vous pouvez spécifier le processus comme suit:bg
=%&
prend un processus en arrière-plan en le démarrant si nécessaire:wait
attend la fin d'un processus d'arrière-plan et renvoie son état de fin:Imaginez que vous avez commencé un long processus (
jobs
révèle qu'il est le numéro 3) et réalisez ensuite que vous voulez que l'ordinateur soit suspendu à la fin, plusecho
un message si le processus n'a pas réussi:la source
man bash
) et largement utilisée exactement comme prévu AFAIK - Je n'ai jamais rien vécu de bizarre.