如何在一行中运行多个 bash 后台命令?
- 2024-10-22 08:28:00
- admin 原创
- 65
问题描述:
我通常使用如下命令来运行多个命令:
sleep 2 && sleep 3
或者
sleep 2 ; sleep 3
但是如果我想通过一个命令行命令在后台运行它们怎么办?
sleep 2 & && sleep 3 &
不起作用。&&
用;
有办法吗?
解决方案 1:
你到底想让它们如何运行?如果你希望它们在后台启动并按顺序运行,你可以这样做:
{ sleep 2; sleep 3; } &
如果您只想在成功sleep 3
时运行sleep 2
,那么:
sleep 2 && sleep 3 &
另一方面,如果您希望它们在后台并行运行,您可以这样做:
sleep 2 & sleep 3 &
这两种技术可以结合起来,例如:
{ sleep 2; echo first finished; } & { sleep 3; echo second finished; } &
Bash 就是 Bash,通常有许多不同的技术来完成同一项任务,尽管有时它们之间有细微的差别。
解决方案 2:
您需要在上一个版本中添加一些括号——
(sleep 2 &) && (sleep 3 &)
或者这也有效——
(sleep 2 &) ; (sleep 3 &)
解决方案 3:
要运行多个后台命令,您需要添加&
每个命令的结尾。例如:(command1 &) && (command2 &) && (command3 &)
解决方案 4:
上面的答案使用了括号。Bash 也可以使用大括号来实现类似的目的:
{ sleep 2 && sleep 3; } &
请注意,括号对语法的要求更高——后面的空格{
、前面的空格}
以及最后的分号都是必需的。在某些情况下,括号更有效,因为它们不会分叉新的子 shell。在这种情况下,我不知道这是否有区别。
解决方案 5:
$(command)
您可以像这样使用 bash 命令替换:
$(command1 ; command2) &
请注意,stdin 和 stdout 仍链接到父进程,至少重定向 stdout 可能比较棘手。因此,您也可以将命令串联到一行中,然后将字符串传递给命令bash
以生成一个将处理执行的新进程。
bash -c "command1 ; command2" &
当您需要在后台运行多个命令时,这在 bash 脚本中特别有用。
这两个语句应该是等效的。在这两种情况下,都会生成一个bash进程来处理命令(命令链),最后&
再分离执行。
这次,您可以在命令末尾添加,以至少重定向 stdout 并避免在父进程的 stdout 上输出。例如&>/dev/null
:&
bash -c "command1 ; command2" &>/dev/null &
解决方案 6:
这有效:
$(sleep 2 &) && sleep 3 &
你也可以这样做:
$(sleep 2 && sleep 3) &
解决方案 7:
我也有同样的任务。我试过了(sleep2 ; fg )& sleep3 ; fg
,成功了。当你双击 ctrl+c 时,这两个进程就可以停止。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件