如何在一行bash中运行多个后台命令?

我通常运行多个命令,就像这样:

sleep 2 && sleep 3

sleep 2 ; sleep 3

但是如果我想从一个命令行命令在后台运行它们呢?

sleep 2 & && sleep 3 &

是行不通的。用;替换&&也不行

有办法吗?

107812 次浏览

如此:

$(sleep 2 &) && sleep 3 &

你还可以:

$(sleep 2 && sleep 3) &

你需要在你的上一个版本中添加一些括号

(sleep 2 &) && (sleep 3 &)

或者这个也可以

(sleep 2 &) ; (sleep 3 &)

你到底想让他们怎么运作?如果你想让它们在背景中启动并运行按顺序,你可以这样做:

{ sleep 2; sleep 3; } &

如果你想让sleep 3只在sleep 2成功时运行,那么:

sleep 2 && sleep 3 &

另一方面,如果你想让它们在平行中运行在背景中,你可以这样做:

sleep 2 & sleep 3 &

这两种技术可以结合起来,比如:

{ sleep 2; echo first finished; } & { sleep 3; echo second finished; } &

Bash就是Bash,通常有许多不同的技术来完成相同的任务,尽管有时它们之间有细微的区别。

要运行多个后台命令,您需要在每个命令后添加&。 例: (command1 &) && (command2 &) && (command3 &) < / p >

上面的答案用圆括号。Bash也可以使用大括号达到类似的目的:

{ sleep 2 && sleep 3; } &

注意,大括号在语法上更挑剔——{之后的空格,}之前的空格,以及最后的分号都是必需的。在某些情况下,大括号更有效,因为它们不会派生新的子shell。在这种情况下,我不知道是否有区别。

我也有同样的使命。 我已经尝试了(sleep2 ; fg )& sleep3 ; fg,它正在工作。 当你按下ctrl+c double键时,这两个进程可以停止

你可以像这样使用bash命令替换$(command):

$(command1 ; command2) &

请注意,stdin和stdout仍然链接到父进程,重定向至少是stdout可能很棘手。因此,您也可以将命令链接在一行中,然后将字符串传递给bash命令,以生成一个将处理执行的新进程。

bash -c "command1 ; command2" &

当您需要在后台运行多个命令时,这在bash脚本中特别有用。

这两个表述应该是等价的。在这两种情况下都会生成bash进程来处理命令(命令链),而在最后的&将分离执行。

这一次,你可以在命令末尾的&之前添加&>/dev/null,至少重定向标准输出,并避免父进程的标准输出上的输出。喜欢的东西:

bash -c "command1 ; command2" &>/dev/null &