如何后台执行命令链?


15

我想像这样的命令链作为背景cp a b && mv b c && rm a

我尝试做,cp a b && mv b c && rm a &但这仅是最后一个过程的背景。

如何为命令链设置背景?

Answers:


22

cp a b && mv b c && rm a &是正确的。&的优先级低于&&。实际上,&它的优先级低于;和换行符:&与属于同一语法类别;,区别在于;在前台&运行命令列表而在后台运行命令列表。您可以自己测试:

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited

与pdksh,ksh93,bash,csh,tcsh相同。

zsh是一个例外,它奇怪地不兼容。这在手册中有记录

如果子列表以&&|或终止&!,则外壳程序将在后台执行它的最后一个管道,并且不等待其完成(请注意与在后台执行整个子列表的其他外壳程序的不同)。

不幸的是,即使在sh或ksh兼容模式下,zsh也会以这种方式运行。为确保整个命令在后台执行,请在其周围加上花括号或括号。括号创建子外壳,而括号不创建子外壳,但这无关紧要(除非在某些外壳中进行微优化),因为无论如何后台命令都在子外壳中。

{ cp a b && mv b c && rm a; } &

8
bnd bash{ ... ; } &在当前进程级别( ... ) &执行一次派生,而从子外壳执行一次派生...结果是相同的,但是无论如何都存在细微的差异。
F. Hauri

14

您可以将其放入(cp a b && mv b c && rm a )&包括整个链条在内的各种寄生虫中。


2
重要的是,这使整个链条都具有了背景知识,即使对于可能不知道如何限制操作员规则的人来说也是如此
jackweirdy 2013年

2
看看我对@Gilles答案的评论,我认为这{ ... ; }是一种更好的方式。
F. Hauri
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.