Jak napisać pętlę for, która uruchamia polecenie asynchroniczne w każdej iteracji?


23

Zastanawiam się, dlaczego wystąpił błąd przy użyciu asynchronicznego polecenia w pętli?

$ for i in {1..8}; do sleep 100 & ; done
bash: syntax error near unexpected token `;'

Jeśli napiszę to jako

$ for i in {1..8}; do 
> sleep 100 & 
> done

to działa dobrze.

Jak mogę napisać to w jednym wierszu bez błędu?

Odpowiedzi:


39

Upuść ;:

for i in {1..8}; do sleep 100 & done

&rozdziela polecenia , więc ;jest obcy (a powłoka oczekuje czegoś pomiędzy &i ;).


Dzięki. „powłoka oczekuje czegoś między & a;”, więc dlaczego puste polecenie nie jest w porządku między & a;?
— Tim

5
Prawdziwe polecenie no-op to:
— HTNW

1
@StephenKitt, sekcja, do której się odwołujesz, stwierdza również: „W sesji interaktywnej lub skrypcie z innymi poleceniami dodatkowe znaki <newline> lub <semicolon> ... nie kwalifikują się jako opisane tutaj puste polecenie, ponieważ zostałyby zużyte przez inne części gramatyki. ” Hmmm ...
— Wildcard,

1
@Wildcard, które jest interesujące, nie zastanawiałem się nad konsekwencjami tego zdania, badając odpowiedź na dalsze działania Tima. Włączenie trybu POSIX Basha nie zmienia jego zachowania pod tym względem. Hmmm, rzeczywiście ...
— Stephen Kitt,

2
@Wildcard: echo foo ; ; echo barw bash 4.4 mówi syntax error near unexpected token `;'. dashdaje podobny błąd. W tym przypadku jest to puste polecenie, ponieważ żadna inna część gramatyki go nie zużywa. Myślę, że mogą mówić o zbędnych ;na końcu linii, takich jak sleep 100;(nowa linia).
— Peter Cordes,

22

Zgrupuj swoje dodziałania w nawiasach klamrowych:

for i in {1..8}; do { sleep 100 & }; done

Łatwy do zrozumienia zarówno dla Ciebie, jak i dla Bash!

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.