Wie wird eine Befehlskette im Hintergrund dargestellt?

15

Ich möchte eine Befehlskette wie Hintergrund cp a b && mv b c && rm a.

Ich habe versucht cp a b && mv b c && rm a &, dies zu tun, aber dies ist nur der Hintergrund des letzten Prozesses.

Wie hinterlasse ich eine Befehlskette?

Cobra_Fast
quelle

Antworten:

22

cp a b && mv b c && rm a &ist richtig. &hat eine niedrigere Priorität als &&. Tatsächlich &hat es eine niedrigere Priorität als ;und newline: Es &gehört zur gleichen syntaktischen Kategorie wie ;, mit dem Unterschied, dass ;die Befehlsliste im Vordergrund und die Befehlsliste &im Hintergrund ausgeführt wird. Sie können dies selbst testen:

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited

Dasselbe gilt für pdksh, ksh93, bash, csh, tcsh.

Die Ausnahme ist zsh, was seltsamerweise inkompatibel ist. Dies ist im Handbuch dokumentiert :

Wenn ein sublist durch eine beendet wird &, &|oder &!führt die Shell die letzte Pipeline in es im Hintergrund und wartet nicht , bis es beendet wird (die Differenz von anderen Shells beachten , die die ganze sublist im Hintergrund ausführen).

Leider verhält sich zsh auch im sh- oder ksh-Kompatibilitätsmodus so. Um sicherzustellen, dass der gesamte Befehl im Hintergrund ausgeführt wird, müssen Sie ihn in Klammern oder Klammern setzen. Klammern erzeugen eine Unterschale, geschweifte Klammern dagegen nicht. Dies ist jedoch irrelevant (außer als Mikrooptimierung in einigen Schalen), da sich ein Befehl mit Hintergrund sowieso in einer Unterschale befindet.

{ cp a b && mv b c && rm a; } &
Gilles 'SO - hör auf böse zu sein'
quelle
8
Unter bash , { ... ; } &bei aktueller Prozessebene eine Gabel tun, während ( ... ) &von einer Subshell eine Gabel tun ... Das Ergebnis ist die gleiche, aber es ist auf jeden Fall ein feiner Unterschied.
F. Hauri
14

Sie können es in Klammern setzen (cp a b && mv b c && rm a )&, um die gesamte Kette einzuschließen .

Wiederholung
quelle
2
Und was wichtig ist, dies macht deutlich, dass die gesamte Kette Hintergrundinformationen enthält, selbst für jemanden, der die Regeln für die
Begrenzung
2
Schauen Sie sich meinen Kommentar zu @ Gilles Antwort an, ich denke, es { ... ; }ist eine vorzuziehende Form (Weg).
F. Hauri