Как написать цикл for, который запускает асинхронную команду в каждой итерации?

23

Интересно, почему возникает ошибка при использовании асинхронной команды внутри цикла?

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

Если я напишу это как

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

это отлично работает

Как я могу написать это в одной строке без ошибок?

Тим
источник

Ответы:

39

Оставьте ;:

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

&разделяет команды , так что ;посторонний (и оболочка ожидает что-то между &и ;).

Стивен Китт
источник
Спасибо. «оболочка ожидает что-то между & и;», так почему же пустая команда не подходит между & и;?
Тим
5
Настоящая команда no-op:
HTNW
1
@StephenKitt, в разделе, на который вы ссылаетесь, также говорится: «В интерактивном сеансе или сценарии с другими командами дополнительные символы <newline> или <точка с запятой> ... не будут квалифицироваться как пустые команды, описанные здесь, потому что они будут использоваться другими части грамматики ". Хммм ...
Джокер
1
@ Дикая карта, это интересно, я не думал о последствиях этого предложения, когда изучал ответ Тиму. Включение режима POSIX в Bash не меняет его поведения в этом отношении. Хммм действительно ...
Стивен Китт
2
@Wildcard: echo foo ; ; echo barв bash 4.4 написано syntax error near unexpected token `;'. dashдает похожую ошибку. В этом случае это пустая команда, потому что никакая другая часть грамматики не использует ее. Я думаю, что они могут говорить о избыточности ;в конце строки, как sleep 100;(новая строка ).
Питер Кордес
22

Сгруппируйте свои doдействия в фигурных скобках:

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

Легко понять как для вас, так и для Bash!

Pandya
источник