我可以像这样在无限循环中运行:
$ while true; do foo; done
我可以像这样运行一些分离的东西:
$ foo &
但是我无法在无限循环中运行这样的东西:
$ while true; do foo & ; done
-bash: syntax error near unexpected token `;'
如何在一行shell代码中运行无限分离循环?
答案 0 :(得分:0)
&
是;
之类的终结符,你不能将它们混合在一起。只需使用
while : ; do foo & done
我会添加一个sleep
,否则你很快会淹没你的系统。
答案 1 :(得分:0)
如果你想在后台运行循环,而不是每个foo
命令,你可以把整个东西放在括号中:
( while true; do foo; done ) &
答案 2 :(得分:0)
你应该澄清你是否想要
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
完全退出时再次尝试。
你明白了。