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

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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.