So führen Sie mehrere Befehle in Bash aus, einige im Hintergrund

803
pcnate

Ich möchte mehrere Befehle in Bash ausführen, aber einige von ihnen müssen im Hintergrund ausgeführt werden. Der beste Weg, dies zu erklären, ist der folgende Befehl, der nicht funktioniert ...

for@barpc:~> (sleep 30;command1;command2 param ) & ; anotherCommand 

Ich denke, das könnte als zwei Fragen aufgefasst werden:

  1. Wie beende ich das & in einem Befehl?
  2. Was wäre ein besserer Weg, um dies zu erreichen?

Andere Details, wenn es darauf ankommt:

  • Opensuse 13.2
  • Gnomenschale
2

2 Antworten auf die Frage

4
Gordon Davisson

Sie müssen nur das entfernen ;. &Fungiert als Befehlstrennzeichen für sich, das Hinzufügen ;danach ist ungültig.

(sleep 30; command1; command2 param ) & anotherCommand 

(Die Leerzeichen nach den Semikolons sind nicht erforderlich. Ich finde es einfach einfacher, auf diese Weise zu lesen. Dies ist einer der wenigen Orte, an denen Leerzeichen in der Shell-Syntax optional sind - die meisten Stellen sind entweder erforderlich oder verboten.)

Für bessere Wege, dies zu tun ... das hängt wirklich davon ab, was Sie genau tun. Wir benötigen mehr Informationen, um bessere Vorschläge zu machen.

Bitte, bitte stimmen Sie dem zu, es erklärt * warum * der Code von OP nicht funktionierte, anstatt blinde Klammern zu werfen, in der Hoffnung, dass dies der Fall ist. Darkhogg vor 8 Jahren 0
3
MariusMatutiae

Du solltest es versuchen

(sleep 5; ls) & echo "Now" 

Dies funktioniert so, wie Sie es wünschen.

Wow, das ist so einfach, dass es offensichtlich war. Vielen Dank! pcnate vor 8 Jahren 1
Beachten Sie, dass Sie auf diese Weise eine unnötige Sub-Shell hinzugefügt haben, die Sie daran hindert, auf den Hintergrundjob zu warten, falls dies jemals erforderlich ist. Darkhogg vor 8 Jahren 0