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

时间:2013-01-30 19:45:38

标签: linux bash shell

我通常使用以下内容运行多个命令:

sleep 2 && sleep 3

sleep 2 ; sleep 3

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

sleep 2 & && sleep 3 &

不起作用。并且&&替换;

有办法吗?

9 个答案:

答案 0 :(得分:247)

您希望它们如何运行?如果您希望它们在后台启动并按顺序运行 ,您可以执行以下操作:

(sleep 2; sleep 3) &

另一方面,如果您希望它们在后台运行 parallel ,则可以这样做:

sleep 2 & sleep 3 &

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

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

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

答案 1 :(得分:40)

您需要在上一个版本中添加一些parens -

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

或者这也有效 -

(sleep 2 &) ; (sleep 3 &)

答案 2 :(得分:7)

要运行多个后台命令,您需要在每个命令的末尾添加&。 例如: (command1 &) && (command2 &) && (command3 &)

答案 3 :(得分:5)

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

{ sleep 2 && sleep 3; } &

请注意,大括号对语法更加挑剔 - {之后的空格,}之前的空格以及最终的分号都是必需的。在某些情况下,大括号更有效,因为它们不会分叉新的子shell。在这种情况下,我不知道它是否有所作为。

答案 4 :(得分:4)

这有效:

$(sleep 2 &) && sleep 3 &

你也可以这样做:

$(sleep 2 && sleep 3) &

答案 5 :(得分:0)

我也有同样的使命。 我试过(sleep2 ; fg )& sleep3 ; fg,它正在运作。 当你预先ctrl + c加倍时,这两个过程就可以停止了。

答案 6 :(得分:0)

如果要依次运行多个命令,有一个非常简单的方法可以在所有地方使用:创建文件!这种方法的好处是它干净简洁。

首先,使用一个名称创建文件,例如commands.sh。然后,将命令放在此处。这是一个示例:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

好的,现在我们进入了最后一步。要在后台(顺序)运行命令,只需运行:

$ sh commands.sh &

答案 7 :(得分:0)

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

$(command1 ; command2) &

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

bash -c "command1 ; command2" & 

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

这两个语句应该等效。在两种情况下都会产生一个 bash 进程来处理命令(命令链),最后的&会分离执行。

这次,您可以在命令末尾的&>/dev/null之前添加&,以至少重定向标准输出,并避免在父进程的标准输出上进行输出。像这样:

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

答案 8 :(得分:-1)

使用 NPM 的跨平台解决方案 - 但不是“纯 bash”

如果你的机器上已经有 node/npm,你可以获取以下任一包来帮助以跨平台友好的方式声明性地运行多个同步或异步命令:

像这样从任何 shell 运行多个命令:

npx concurrently "sleep 2" "sleep 5"

cross platform concurrently

当您必须跨机器共享脚本并且无法控制它们将在哪里执行时,这是一个很好的逃生口。