在后台多次运行同一命令


14

如何运行多个命令并使用bash后台运行它们?

例如:

$ for i in {1..10}; do wait file$i &; done

其中wait是自定义二进制文件。

现在我得到一个错误:

syntax error near unexpected token `;'

运行上面的命令时。

后台运行后,命令应并行运行。


1
我不赞成您不提及:nohup允许您在后台执行命令
Dave Hamilton

3
您看到的错误是由于引起的,&并且;都是“命令终止符”。您无需同时使用两者:for ...; do wait $arg & done可以使用。
glenn jackman

@glenn杰克曼。是的,我实际上是在发布问题后尝试过的。两者都没有必要; 和&
Sebi

3
对于将来的读者,请指向文档的链接:“列表是一个或多个管道的序列,这些管道由运算符';','&','&&'或'||'中的一个分隔,并可选地以一个终止';','&'或换行符。” (我的重点)
格伦·杰克曼(Glenn Jackman

Answers:


21

&,就像;是一个列表终止符。它们具有相同的语法,并且可以互换使用(取决于您要执行的操作)。这意味着您不想要或不需要,command1 &; command2您只需要command1 & command2

因此,在您的示例中,您可以编写:

for i in {1..10}; do wait file$i & done

并且每个wait命令将在后台启动,并且循环将立即移至下一个。


4

为了兼容性,请使用posix形式而不是扩展形式:

for i in $(seq 1 10); do (./wait file$i &); done

1
注意,这seq不是POSIX命令,通常只能在GNU系统上找到。行为或$(...)(和$i)取决于的当前值$IFS。另请注意,通过执行(cmd &)cmd它将是subshel​​l的子级,因此您将无法等待并获得其退出状态。
斯特凡Chazelas

2

您可以对命令进行分组,然后将分组的命令置于后台。喜欢 :

$ for i in {1..10}; do ((wait file$i)&); done

不需要使用内括号...
marc

仅当您要在后台按问题要求输入多个命令时,才需要使用内部括号。像((sleep 1; wait file $ i)&);
2013年

2

您的二进制文件真的命名wait吗?我不建议这样做,因为wait它是内置的shell。

我认为bash无法很好地解析启动后台进程的单行循环。我建议您将代码更改为:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
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.