Ich nehme an, Sie wollen das:
myCommand1 & myCommand2 &
Dies startet myCommand1
und sendet es an den Hintergrund, gefolgt von kaufmännischem Und, startet dann sofort myCommand2
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 .
Eine Liste ist eine Folge von einer oder mehreren Pipelines, die von einem der Operatoren getrennt werden . , & , && oder || und optional beendet durch einen von
; , & , oder .
Wenn ein Befehl vom Steueroperator & beendet wird , führt die Shell den Befehl im Hintergrund in einer Subshell aus. Die Shell wartet nicht auf den Abschluss des Befehls und der Rückgabestatus ist 0. Befehle getrennt durch a ; werden nacheinander ausgeführt; Die Shell wartet darauf, dass jeder Befehl nacheinander beendet wird. Der Rückgabestatus ist der Beendigungsstatus des zuletzt ausgeführten Befehls.
AND- und OR-Listen sind Sequenzen einer oder mehrerer Pipelines, die durch && und || getrennt sind Steueroperatoren.
Quelle:man bash
Lassen Sie uns das in Beispiele zerlegen. Sie können eine Liste erstellen, indem Sie Befehle kombinieren und mit einem der folgenden trennen ; & && ||
:
command1 ; command2 # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2 # runs simultaneously
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:
# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) &
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &
Dies kann ziemlich kompliziert werden, wenn Sie sich nicht sicher sind true
und false
testen möchten , ob die Konstruktion wie erwartet funktioniert:
$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2
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:
- Ctrl+ Zgibt das Suspend- Zeichen ein, das bewirkt, dass der aktuell im Vordergrund ausgeführte Prozess gestoppt wird. Er wird nicht beendet, sondern verbleibt in der
jobs
Liste
- Ctrl+ Ygibt das verzögerte Suspend- Zeichen ein, das bewirkt, dass der aktuell im Vordergrund ausgeführte Prozess gestoppt wird, wenn versucht wird, Eingaben vom Terminal zu lesen
fg
= %
bringt einen Prozess in den Vordergrund und startet ihn bei Bedarf. Sie können den Prozess wie folgt angeben:
% # last process in the jobs list
%1 # 1st process in the jobs list
%abc # process beginning with the string “abc”
%?abc # process containing the string “abc” anywhere
bg
= %&
nimmt einen Prozess in den Hintergrund und startet ihn bei Bedarf:
%& # last process in the jobs list
%1& # 1st process in the jobs list
%abc& # process beginning with the string “abc”
%?abc& # process containing the string “abc” anywhere
wait
Wartet auf den Abschluss eines Hintergrundprozesses und gibt seinen Beendigungsstatus zurück:
wait %1 # 1st process in the jobs list
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, sowie echo
eine Meldung, wenn der Prozess nicht erfolgreich war:
wait %3 || echo failed ; systemctl suspend