我想运行链式命令,但有些是连续的,有些则在后台运行。
运行此命令:
echo 1 && echo 2 & echo 3 && echo 4
我想要得到:
1
2 (background)
3
4
但我明白:
3
4
1
2
一个更现实的例子:
compile &&
run server & (background, used by tests below)
run test 1 &&
run test 2 &&
kill server
我如何使用 bash 来做到这一点?
谢谢!
答案1
我认为你的要求是:
echo 1 && { echo 2 & } && echo 3 && echo 4
上面echo 1
是在前台运行,但echo 2
在后台运行。
请注意,&&
后续操作echo 2
可能并非如您所想。请考虑:
$ echo 1 && { false & } && echo 3 && echo 4
1
[2] 28445
3
4
以上代码表明,echo 3
即使第二条命令false
返回失败,该命令仍会运行。这是因为在决定启动时,后台进程的返回代码不可用echo 3
。
让我们考虑一下更现实的例子:
compile && { run server & } && run test 1 && run test 2 && kill server
run test 1
无论run server
成功还是失败,都会启动。更糟糕的是,run test 1
可能会在run server
完成服务器设置之前启动。一个快速解决方法是延迟run test 1
足够的时间,直到您确信已run server
完成设置:
compile && { run server & } && sleep 1 && run test 1 && run test 2 && kill server
或者,您需要了解一些信息run server
以便可以测试其是否成功设置。
背景
括号
{...}
创建一个列表。因此,该构造允许我们在只对列表中的命令执行运算符效果的情况下{ echo 2 & }
运行。echo 2
&
&&
&&
是 bash 的逻辑与。只有当前一个命令成功(即返回代码 0)时,才会运行 后面的命令。
答案2
您可以使用 nohup 在后台运行命令: echo 1 && nohup echo 2 && echo 3
1
nohup: ignoring input and appending output to ‘nohup.out’
3