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?

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; } &

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 .


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
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.