Chcę ustawić w tle łańcuch poleceń cp a b && mv b c && rm a
.
Próbowałem zrobić, cp a b && mv b c && rm a &
ale to tylko tło ostatniego procesu.
Jak utworzyć tło dla łańcucha poleceń?
Chcę ustawić w tle łańcuch poleceń cp a b && mv b c && rm a
.
Próbowałem zrobić, cp a b && mv b c && rm a &
ale to tylko tło ostatniego procesu.
Jak utworzyć tło dla łańcucha poleceń?
Odpowiedzi:
cp a b && mv b c && rm a &
jest poprawne. &
ma niższy priorytet niż &&
. W rzeczywistości &
ma niższy priorytet niż cokolwiek innego, ;
a nowa linia: &
należy do tej samej kategorii składniowej ;
, z tą różnicą, że ;
uruchamia listę poleceń na pierwszym planie, podczas gdy &
działa w tle. Możesz to sprawdzić sam:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
To samo z pdksh, ksh93, bash, csh, tcsh.
Wyjątkiem jest zsh, który jest dziwnie niezgodny. Jest to udokumentowane w instrukcji :
Jeśli lista podrzędna jest zakończona przez a
&
,&|
lub&!
, powłoka wykonuje ostatni potok w niej i nie czeka na jej zakończenie (zwróć uwagę na różnicę w stosunku do innych powłok wykonujących całą podlistę w tle).
Niestety, zsh zachowuje się w ten sposób, nawet w trybie zgodności sh lub ksh. Aby upewnić się, że całe polecenie jest wykonywane w tle, umieść wokół niego nawiasy klamrowe lub nawiasy. Nawiasy tworzą podpowłokę, podczas gdy nawiasy klamrowe nie, ale nie ma to znaczenia (z wyjątkiem mikrooptymalizacji w niektórych powłokach), ponieważ i tak polecenie w tle znajduje się w podpowłoce.
{ cp a b && mv b c && rm a; } &
możesz umieścić to w nawiasach takich (cp a b && mv b c && rm a )&
jak cały łańcuch.
{ ... ; }
jest to preferowana forma (sposób).
{ ... ; } &
wykonaj widelec na bieżącym poziomie procesu, podczas gdy( ... ) &
zrobić widelec z podpowłoce ... Wynik jest taki sam, ale jest subtelna różnica i tak.