Wie kann man mit einem Befehl mehrere Programme im Hintergrund ausführen?

36

Wie kann man mit einem Befehl mehrere Programme im Hintergrund ausführen?

Ich habe die folgenden Befehle ausprobiert, aber sie funktionieren nicht.

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
quelle
Was ist ein einzelner "Befehl"? Eine Reihe von Bash?
Oluf Lorenzen
Mir fehlt möglicherweise etwas Offensichtliches, aber && setzt voraus, dass ich den Exit-Code des vorherigen Befehls kenne. Wenn Sie es im Hintergrund sehen, wird der Exit-Code nicht bekannt sein. Was war der Funktionsbedarf dort?
Richlv

Antworten:

32

Trennt aus Sicht der Shell-Syntax &Befehle wie ;/ |/ &&... (allerdings mit unterschiedlicher Semantik). Also ist es nur:

cmd1 & cmd2 & cmd3 &
Stéphane Chazelas
quelle
1
Ist dies nicht / ganz / richtig, ;startet der nächste Befehl, sobald der erste beendet ist. &Setzt den Befehl tatsächlich in den Hintergrund. versuchen Sie es einfach:echo foo & echo bar & echo test &
Oluf Lorenzen
1
@Finkregh natürlich. Niemand bezweifelt das. Ich habe nur gemeint, dass beide Befehle (aus der Sicht der Syntax) unabhängig voneinander ausgeführt werden.
Stéphane Chazelas
Es ist nicht ganz das, was gefragt wurde, da die Frage die Ausgabe eines "einzelnen Befehls" spezifizierte. Weder ist meine Antwort, wie es auch eine Reihe von Befehlen ist, aber es hat mindestens eine Semantik eines einzelnen Befehls in dieser Ausgabe verkettet, kann umgeleitet werden, etc.
Eli Heady
"Mehrere Befehle mit einem einzigen Befehl" scheint jedoch ein Oxymoron zu sein - was bedeutet das? Wenn dies für so etwas ist sudo, könntest du das Passwort nur einmal eingeben, dann einwickeln bash -coder ähnliches.
Richlv
12

Der Bash-Manpage-Abschnitt mit dem Titel Compound Commands (Zusammengesetzte Befehle) enthält zwei Optionen, die funktionieren, nämlich Befehle auflisten und gruppieren.

Ein Gruppenbefehl ist eine Reihe von Befehlen in geschweiften Klammern {}. Eine Liste ist die gleiche, in Klammern eingeschlossen (). Beide können verwendet werden, um mehrere Befehle im Hintergrund auszuführen und schließlich die gesamte Sammlung als Gruppe im Hintergrund anzuzeigen. Das Listenkonstrukt führt Befehle in einer Subshell aus, sodass die Variablenzuweisungen nicht beibehalten werden.

So führen Sie eine Gruppe von Befehlen aus:

{ command1 & command2 & } &

Sie können Ihre Befehle auch in einer Liste (Subshell) ausführen:

( command1 & command2 ) &
Eli Heady
quelle
1
Bitte. Ich habe den Link zum Handbuch hinzugefügt. Beachten Sie, dass die ()Listensyntax die eingeschlossenen Befehle in einer Subshell ausführt, sodass Variablen in dieser nicht beibehalten werden.
Eli Heady
3

ein anderer Weg:

$(command1 &) && command2 & 
Persischer Golf
quelle
Nein, zuerst wird der Befehl ausgeführt, dann nach dem Beenden, dann wird ein weiterer Befehl ausgeführt
Rahul Patil
Sie verwendet &&in Ihrer Frage, bedeutet dies zunächst dann einen Befehl ausführen , wenn successfuly ausführen, können Sie es nicht neben command.if laufen betrachten, die Sie ausführen könnencommand1 & ; command2 & ;
Persischer Golf
Der erste Befehl wird erfolgreich in bg ausgeführt oder ;ohne Probleme ausgeführt
Rahul Patil,