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

Linux 如何在一行中运行bash中的多个后台命令?,linux,bash,shell,Linux,Bash,Shell,我通常使用以下命令运行多个命令: sleep 2 && sleep 3 { sleep 2; sleep 3; } & $(command1 ; command2) & 或 但是,如果我想从一个命令行命令在后台运行这两个命令,该怎么办 sleep 2 & && sleep 3 & 不起作用。用替换&&也不可行 有办法吗?这样做有效: $(sleep 2 &) && sleep 3 & 您还可

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

sleep 2 && sleep 3
{ sleep 2; sleep 3; } &
$(command1 ; command2) &

但是,如果我想从一个命令行命令在后台运行这两个命令,该怎么办

sleep 2 & && sleep 3 &
不起作用。用
替换
&&
也不可行

有办法吗?

这样做有效:

$(sleep 2 &) && sleep 3 &
您还可以执行以下操作:

$(sleep 2 && sleep 3) &

您需要在上一版本中添加一些参数--

或者这也有效--


你到底想让他们怎么跑?如果希望它们在后台启动并按顺序运行,可以执行以下操作:

sleep 2 && sleep 3
{ sleep 2; sleep 3; } &
$(command1 ; command2) &
如果希望仅在
sleep 2
成功时运行
sleep 3
,则:

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

sleep 2 & sleep 3 &
这两种技术可以结合使用,例如:

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

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

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

以上答案使用括号。Bash还可以使用大括号实现类似的目的:

{ sleep 2 && sleep 3; } &

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

我也有同样的使命。 我尝试了
(sleep2;fg)&sleep3;fg
,它正在工作。
当你按ctrl+c的两倍键时,这两个过程就会停止。

如果你想按顺序运行多个命令,有一个非常简单的方法可以在任何地方使用:创建一个文件!这种方法的优点是干净简单

首先,使用名称创建文件,例如
commands.sh
。然后,把你的命令放在那里。以下是一个示例:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;
好了,现在我们到了最后一步。要在后台(按顺序)运行命令,只需运行:

$ sh commands.sh &

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

sleep 2 && sleep 3
{ sleep 2; sleep 3; } &
$(command1 ; command2) &
请注意,stdin和stdout仍然链接到父进程,并且至少重定向stdout可能很棘手。因此,您也可以在一行中链接这些命令,然后将字符串传递给
bash
命令,以生成一个新的进程来处理执行

bash -c "command1 ; command2" & 
当您需要在后台运行多个命令时,这在bash脚本中特别有用

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

bash -c "command1 ; command2" & 
这一次,您可以在命令末尾的
&>/dev/null
之前添加
&
,以至少重定向stdout并避免父进程的stdout上的输出。比如:

bash -c "command1 ; command2" &>/dev/null &
使用NPM的跨平台解决方案-但不是“纯bash” 如果您的计算机上已经有node/npm,那么您可以获取以下软件包之一,以帮助以跨平台友好的方式声明性地运行多个同步或异步命令:

从任意shell运行多个命令,如下所示:

sleep 2 && sleep 3
{ sleep 2; sleep 3; } &
$(command1 ; command2) &
npx并发“睡眠2”和“睡眠5”


当您必须在多台机器之间共享脚本并且无法控制脚本的执行位置时,这是一个很好的逃生舱。

使用
()
来包围该命令。这是一个简洁、深思熟虑的答案,终生“教人钓鱼”。谢谢。如果我们执行
睡眠2和睡眠3&
,会发生什么?我在bash中试用过,它的工作方式似乎与echo相同。@HakanBaba,是的,它确实在背景中创建了一个子shell。@Wajahat,您是否尝试过
sleep 2&&echo“foo”和&sleep 3&echo“bar”“
&&
操作符告诉shell在它之前执行命令,并且只有在该命令执行时没有任何错误,shell才会执行后续命令。这本质上不同于
,因为
允许执行后续命令,而不管前一个命令的退出状态如何,除非是致命错误。
&
告诉shell在后台执行它前面的所有“已连接”命令。此处的“已连接”表示该命令是管道(
|
)或逻辑运算符的一部分。
这些列表运算符中,&&&'和“||”具有同等优先级,后跟“;”和具有同等优先级的“&”。
在bash手册中。关于
{sleep 2;sleep 3;}&
?注意:当列表与
&
一起使用时,其退出状态始终为零。因此,上面的两种情况做了相同的事情(shell轮流异步执行两侧)。