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轮流异步执行两侧)。