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.