在单行bash循环中使用&(与号)


58

我一直在成功使用此命令,该命令会更改配置文件中的变量,然后在循环内执行Python脚本:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py; done

由于每个程序DoMyScript.py本身都需要30秒钟才能终止,因此我想将它们放回后台,同时可以生成下一个程序。

我尝试通过添加以下与号来尝试熟悉的内容:

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py &; done

但是,这导致以下错误:

-bash:意外令牌';'附近的语法错误

Answers:


85

放下;之后&。这是一个语法要求

for((i=114;i<=255;i+=1)); do echo $i > numbers.txt;python DoMyScript.py & done

1
该死的,43秒太慢了:)
Martin von Wittich

2
@MartinvonWittich,以体谅的方式为您的答案+1 ;-)
iruvar

4
虽然这回答了问题,但可能不是OP想要的,因为所有python实例启动并初始化时,它们都将看到一个numbers.txtcontains 255
斯特凡Chazelas

1
同意@StephaneChazelas,但不确定使用问题中提供的信息我们真的可以做些什么。一个适当的解决方案可能需要更多的上下文。
CVn 2013年


14

鉴于Stephane对1_CR的回答的评论,您可能想要:

for i in {114..255}; do { echo $i > numbers.txt && python DoMyScript.py; } & done

谢谢格伦。由于可读性的提高,我尝试了一些我喜欢的代码变体,但也许由于我需要额外的睡眠,所以对我来说不起作用。它还将重复该for范围内的最后一个数字...这是我目前满意的一点:for((i=1;i<100;i+=1)); do echo $i > numbers.txt;sleep 3; python DoMyScript.py & done解决了使流程在后台执行的主要问题。
ljs.dev

*当然,我<=在最初的问题中遇到过,因此根据我提供的信息,您提供的范围完全合适。再次感谢您采用的不同方法
ljs.dev 2013年

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.