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


169

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

sleep 2 && sleep 3

要么

sleep 2 ; sleep 3

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

sleep 2 & && sleep 3 &

不起作用。而且也没有更换&&;

有办法吗?


8
使用()包围命令。
nhahtdh 2013年

Answers:


318

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

(sleep 2; sleep 3) &

另一方面,如果您希望它们在后台并行运行,则可以执行以下操作:

sleep 2 & sleep 3 &

并且可以将两种技术结合起来,例如:

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

重击是重击,通常有多种不同的技术可以完成相同的任务,尽管有时它们之间存在细微的差异。


20
这是一个简洁,经过深思熟虑的答案,“终身教人钓鱼”。谢谢。
19:39埋伏

2
如果我们怎么办sleep 2 && sleep 3 &?我用bash尝试过,它似乎以相同的方式工作(尝试使用echo)。
Wajahat

@HakanBaba,是的,的确在后台创建了一个子外壳。
杜威范德里斯特

3
@Wajahat,您尝试过sleep 2 && echo "foo" && sleep 3 & echo "bar""吗?该&&运营商告诉shell之前要执行的命令,并且仅当没有任何错误命令执行shell执行后续命令。这与本质上是不同的;,因为;除非上一条命令是致命错误,否则无论上一条命令的退出状态如何,都可以使其执行下一条命令。该&告诉shell执行所有的“连接”命令的它前面,在背景中。这里的“已连接”表示命令是管道(|)或逻辑运算符的一部分。
杜威范德莱斯特

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.在bash手册中。
Jinbeom Hong

49

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

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

或者这也可以-

(sleep 2 &) ; (sleep 3 &)

注意:当列表与一起使用时&,其退出状态始终为零。因此,以上两种情况都做相同的事情(shell依次异步地执行双方)。
Jinbeom Hong

9

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


5

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

{ sleep 2 && sleep 3; } &

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


1
{ sleep 2; sleep 3; } &
肯尼·埃维特

4

这有效:

$(sleep 2 &) && sleep 3 &

您也可以执行以下操作:

$(sleep 2 && sleep 3) &

0

我也有同样的任务。我尝试过(sleep2 ; fg )& sleep3 ; fg,它正在工作。当您将ctrl + c翻倍时,可以停止这两个过程。


0

您可以使用bash命令替换,$(command)如下所示:

$(command1 ; command2) &

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

bash -c "command1 ; command2" & 

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

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

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

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

-1

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

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

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

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

$ sh commands.sh &
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.