如何编写一个在每次迭代中运行异步命令的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

这很好。

如何将其写成一行而没有错误?

Answers:


39

删除;

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

&分隔命令,所以;是多余的(shell期望在&和之间有一些东西;)。


谢谢。“ shell期望&和;之间有一些东西”,那么为什么&和;之间没有空命令可以呢?
蒂姆(Tim)

5
真正的无操作命令是:
HTNW

1
@StephenKitt,您引用的部分还指出:“在交互式会话或带有其他命令的脚本中,多余的<newline>或<semicolon>字符...将不被视为此处所述的空命令,因为它们将被其他命令消耗语法的一部分。” 嗯...
通配符

1
@Wildcard很有意思,在研究蒂姆后续行动的答案时,我没有考虑过那句话的后果。在这方面,启用Bash的POSIX模式不会改变其行为。嗯,确实是……
Stephen Kitt

2
@Wildcard:echo foo ; ; echo bar在bash 4.4中说syntax error near unexpected token `;'dash给出了类似的错误。在这种情况下,这是一个空命令,因为语法的其他部分都不会使用它。我认为他们可能;sleep 100;(newline)等行的末尾谈论冗余。
彼得·科德斯

22

集团do行动在大括号:

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

对您和Bash都很容易理解!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.