Jak utworzyć tło dla łańcucha poleceń?

15

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ń?

Cobra_Fast
źródło

Odpowiedzi:

22

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; } &
Gilles „SO- przestań być zły”
źródło
8
Pod bash , { ... ; } &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.
F. Hauri
14

możesz umieścić to w nawiasach takich (cp a b && mv b c && rm a )&jak cały łańcuch.

powtórna rozgrywka
źródło
2
I co ważne, wyjaśnia to, że cały łańcuch jest w tle, nawet dla kogoś, kto może nie znać zasad ograniczania operatorów
jackweirdy
2
Spójrz na mój komentarz do odpowiedzi @ Gilles, myślę, że { ... ; }jest to preferowana forma (sposób).
F. Hauri