如何将命令链置于后台?

如何将命令链置于后台?

我想将命令链设置为后台,例如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 )&包含整个链。

相关内容