Answers:
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; } &
您可以将其放入(cp a b && mv b c && rm a )&
包括整个链条在内的各种寄生虫中。
{ ... ; }
是一种更好的方式。
{ ... ; } &
在当前进程级别( ... ) &
执行一次派生,而从子外壳执行一次派生...结果是相同的,但是无论如何都存在细微的差异。