我想将命令链设置为后台,例如cp a b && mv b c && rm a
.
我尝试过这样做,cp a b && mv b c && rm a &
但这只是最后一个过程的背景。
如何设置命令链的后台?
答案1
cp a b && mv b c && rm a &
是正确的。&
优先级低于&&
.事实上,它的优先级比和 newline&
以外的任何东西都低:与 处于相同的语法类别,区别在于在前台运行命令列表而在后台运行它。您可以自己测试一下:;
&
;
;
&
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
与 pdksh、ksh93、bash、csh、tcsh 相同。
zsh 是个例外,它奇怪地不兼容。这是手册中记录:
&
如果子列表以、&|
或终止&!
,则 shell 会在后台执行其中的最后一个管道,并且不会等待它完成(请注意与在后台执行整个子列表的其他 shell 的区别)。
不幸的是,即使在 sh 或 ksh 兼容模式下,zsh 也会以这种方式运行。为了确保整个命令在后台执行,请用大括号或圆括号括起来。圆括号创建子 shell,而大括号则不然,但这无关紧要(除了在某些 shell 中作为微优化),因为后台命令无论如何都在子 shell 中。
{ cp a b && mv b c && rm a; } &
答案2
您可以将其放入括号中,例如(cp a b && mv b c && rm a )&
包含整个链。