单行无限分离循环的语法

时间:2017-10-02 14:24:08

标签: bash loops

我可以像这样在无限循环中运行:

$ while true; do foo; done

我可以像这样运行一些分离的东西:

$ foo &

但是我无法在无限循环中运行这样的东西:

$ while true; do foo & ; done
-bash: syntax error near unexpected token `;'

如何在一行shell代码中运行无限分离循环?

4 个答案:

答案 0 :(得分:0)

&;之类的终结符,你不能将它们混合在一起。只需使用

while : ; do foo & done

我会添加一个sleep,否则你很快会淹没你的系统。

答案 1 :(得分:0)

如果你想在后台运行循环,而不是每个foo命令,你可以把整个东西放在括号中:

( while true; do foo; done ) &

答案 2 :(得分:0)

你应该澄清你是否想要

  • 在后台运行的许多foo副本或
  • 在后台循环中运行的foo的单个副本。

choroba的答案会做前者。要执行后者,您可以使用子shell语法:

(while true; do foo; done) & 

答案 3 :(得分:0)

这里已经有了很好的答案 - 请注意,使用@ choroba校正的原始循环将成功地使一系列非常混乱的过程快速连续生成。

请注意,有几个有用的变体。你可以像这样在循环中抛出一个延迟 -

while true; do sleep 1 && date & done

但这不会导致产生的进程之间出现任何延迟。考虑更像这样的事情:

echo 0 > cond   # false
delay=10        # secs

然后

until (( $(<cond) )) do; sleep $delay && foo & done

while sleep $delay; do (( $(<cond) )) || foo & done

然后确保foo在您希望它停止产生时将cond设置为1。

但我会尝试采用更有控制的方法,比如

until foo; do sleep $delay; done &

在后台运行的前景中运行foo,可以这么说,只有在foo完全退出时再次尝试。

你明白了。