241

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

sleep 2 && sleep 3

或者

sleep 2 ; sleep 3

但是如果我想从一个命令行命令在后台同时运行它们怎么办?

sleep 2 & && sleep 3 &

不起作用。也没有替换&&;

有没有办法做到这一点?

4

7 回答 7

456

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

{ sleep 2; sleep 3; } &

如果您只想sleep 3sleep 2成功时运行,则:

sleep 2 && sleep 3 &

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

sleep 2 & sleep 3 &

这两种技术可以结合使用,例如:

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

Bash 就是 bash,通常有多种不同的技术来完成相同的任务,尽管有时它们之间存在细微的差异。

于 2013-01-30T20:00:39.947 回答
56

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

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

或者这也有效——

(sleep 2 &) ; (sleep 3 &)
于 2013-01-30T19:49:36.370 回答
11

要运行多个后台命令,您需要添加&每个命令的结尾。前任: (command1 &) && (command2 &) && (command3 &)

于 2013-01-31T12:05:25.037 回答
7

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

{ sleep 2 && sleep 3; } &

请注意,大括号对语法更挑剔——后面{的空格、前面的空格}和最后的分号是必需的。在某些情况下,大括号更有效,因为它们不会派生新的子外壳。在这种情况下,我不知道它是否有所作为。

于 2014-10-30T16:29:33.560 回答
3

这有效:

$(sleep 2 &) && sleep 3 &

你也可以这样做:

$(sleep 2 && sleep 3) &
于 2013-01-30T19:48:12.343 回答
2

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

$(command1 ; command2) &

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

bash -c "command1 ; command2" & 

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

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

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

bash -c "command1 ; command2" &>/dev/null &
于 2020-07-10T10:21:39.063 回答
0

我也有同样的使命。我试过(sleep2 ; fg )& sleep3 ; fg了,它的工作。并且当你按 ctrl+c 加倍时,可以停止这两个过程。

于 2016-10-03T09:40:39.890 回答