如何用一个命令在后台运行多个程序?


36

如何用一个命令在后台运行多个程序?

我已经尝试过下面的命令,但是它们不起作用。

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

什么是单个“命令”?一巴掌?
Oluf Lorenzen 2013年


我可能会遗漏一些明显的东西,但是&&意味着知道上一个命令的退出代码。如果您将其作为背景,则退出代码将未知。那里的功能需求是什么?
Richlv

Answers:


32

从shell语法的角度来看,请&分隔诸如;/ |/ &&...之类的命令(尽管当然具有不同的语义)。就是这样:

cmd1 & cmd2 & cmd3 &

1
这不是/ quite /对,请;在第一个命令结束后立即启动下一个命令。&实际上将命令置于后台。尝试一下:echo foo & echo bar & echo test &
Oluf Lorenzen

1
@Finkregh,当然。没有人对此表示怀疑。我只是说它们(从语法的角度)都将命令分开,对它们的运行方式没有影响。
斯特凡Chazelas

询问的内容不尽相同,因为指定的问题是发出“单个命令”。也不是我的回答,因为它太是一系列的命令,但它至少有一个语义在输出一个命令的串接,可以重定向等
伊莱海迪

但是,“多个命令与单个命令”似乎是矛盾的,这意味着什么?如果这是出于类似目的,sudo那么您只能输入一次密码,然后再输入bash -c或类似密码。
Richlv

12

bash手册页标题为“ 复合命令”的部分具有两个可以使用的选项:列表命令和组命令。

组命令是用大括号括起来的一系列命令{}。列表相同,用括号括起来()。两者都可以用于后台处理其中的多个命令,最后可以将整个集合作为后台处理。列表构造在子shell中执行命令,因此不会保留变量分配。

要执行一组命令:

{ command1 & command2 & } &

您还可以在列表(子shell)中执行命令:

( command1 & command2 ) &

1
别客气。我将链接添加到手册中。请注意,列表()语法在子外壳程序中执行封闭的命令,因此不会保留变量。
Eli Heady 2013年

3

其它的办法:

$(command1 &) && command2 & 

不,它将先运行第一个命令,然后先运行后再运行另一个命令
Rahul Patil

&&在问题中使用的意思是,首先运行一个命令,然后如果成功运行,则运行下一个命令。如果您不考虑它,则可以运行command1 & ; command2 & ;
PersianGulf

第一条命令成功放入bg中,或;没有任何问题地运行
Rahul Patil
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.