Ich habe ein Kopfschmerzproblem festgestellt.
Ich möchte mehrere Befehle im Hintergrund ausführen, also möchte ich sie einzeln in Bash starten. Es ist einfach, einen Befehl in der Linux-Shell im Hintergrund zu starten:
myCommand &
Es ist auch einfach, mehrere Befehle wie folgt zu starten:
myCommand1 && myCommand2
oder
myCommand1 ; myCommand2
Wenn ich jedoch mehrere Befehle im Hintergrund ausführen möchte, habe ich das folgende Befehlsformat ausprobiert, bin jedoch fehlgeschlagen:
myCommand1 & && myCommand2 &
oder
myCommand1 & ; myCommand2 &
Beide Formate schlagen fehl. Wie kann ich mehrere Befehle ausführen, die sich &
in einer Befehlszeile befinden?
command-line
bash
Uhr ZHONG
quelle
quelle
Antworten:
Verwenden ().
Wenn Sie sie nacheinander ausführen möchten:
oder
Wenn Sie möchten, dass sie parallel ausgeführt werden:
In bash können Sie dies auch verwenden (Leerzeichen hinter dem {und dem; sind obligatorisch):
quelle
(myCommand1 &) && (myCommand2 &)
läuftmyCommand2
auch wennmyCommand1
fehlgeschlagen.Ich nehme an, Sie wollen das:
Dies startet
myCommand1
und sendet es an den Hintergrund, gefolgt von kaufmännischem Und, startet dann sofortmyCommand2
und sendet auch dieses an den Hintergrund, wodurch die Shell wieder freigegeben wird.Listen
Zum besseren Verständnis können Sie die Pipeline hier durch einen Befehl ersetzen .
Lassen Sie uns das in Beispiele zerlegen. Sie können eine Liste erstellen, indem Sie Befehle kombinieren und mit einem der folgenden trennen
; & && ||
:Sie können Listen mit einer der folgenden Optionen beenden :
; & <newline>
.Normalerweise führen Sie einen Befehl oder eine Liste durch Drücken von aus Enter, das entspricht
<newline>
. Das Semikolon;
dient genau dem gleichen Zweck, insbesondere in Skripten. Das&
kaufmännische Und startet die Befehle jedoch in einer Subshell im Hintergrund und gibt die Shell sofort frei.Sie können runde
()
oder geschweifte Klammern verwenden,{}
um weitere Gruppenlisten zu erstellen. Der Unterschied besteht darin, dass runde Klammern eine Unterschale erzeugen und geschweifte nicht. Geschweifte Klammern benötigen ein Leerzeichen nach dem ersten und ein Semikolon oder eine neue Zeile vor der schließenden Klammer. Beispielsweise:Dies kann ziemlich kompliziert werden, wenn Sie sich nicht sicher sind
true
undfalse
testen möchten , ob die Konstruktion wie erwartet funktioniert:Auftragssteuerung
Der
jobs
Befehl zeigt eine Liste der Hintergrundjobs an, die in der aktuellen Shell ausgeführt werden oder kürzlich abgeschlossen wurden. Es gibt eine Reihe von Tastaturkürzeln und Befehlen für die Jobsteuerung:jobs
Listefg
=%
bringt einen Prozess in den Vordergrund und startet ihn bei Bedarf. Sie können den Prozess wie folgt angeben:bg
=%&
nimmt einen Prozess in den Hintergrund und startet ihn bei Bedarf:wait
Wartet auf den Abschluss eines Hintergrundprozesses und gibt seinen Beendigungsstatus zurück:Stellen Sie sich vor, Sie haben einen langen Prozess gestartet (
jobs
zeigt Nummer 3 an) und stellen dann fest, dass der Computer nach Abschluss angehalten werden soll, sowieecho
eine Meldung, wenn der Prozess nicht erfolgreich war:quelle
man bash
) und wird genau so verwendet, wie es beabsichtigt ist. AFAIK - ich habe nie etwas Seltsames erlebt.