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.