Как написать цикл 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;(новая строка ).
Питер Кордес

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.