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?
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:
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; } &
Sie können es in Klammern setzen (cp a b && mv b c && rm a )&
, um die gesamte Kette einzuschließen .
{ ... ; }
ist eine vorzuziehende Form (Weg).
{ ... ; } &
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.