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 ';'

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 &

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 ) &

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 & 

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,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.