Bash 命令链

Bash 命令链

我想运行链式命令,但有些是连续的,有些则在后台运行。

运行此命令:

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

相关内容