如何背景命令链?

Cob*_*ast 15 shell zsh background-process

我想将一个命令链作为背景,如cp a b && mv b c && rm a.

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

我如何后台命令链?

Gil*_*il' 22

cp a b && mv b c && rm a &是正确的。&的优先级低于&&. 事实上,&除了;和 newline:之外的任何东西都具有更低的优先级:&与 处于相同的句法类别;,区别在于;在前台&运行命令列表而在后台运行它。你可以自己测试一下:

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
Run Code Online (Sandbox Code Playgroud)

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

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

如果子列表以&, &|, 或 结束&!,shell 将在后台执行其中的最后一个管道,并且不等待它完成(注意与在后台执行整个子列表的其他 shell 的区别)。

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

{ cp a b && mv b c && rm a; } &
Run Code Online (Sandbox Code Playgroud)

  • Ùnder [tag:bash], `{ ... ; } &` 在当前进程级别做一个fork,而`( ... ) &` 从一个子shell 做一个fork ... 结果是一样的,但还是有细微的差别。 (8认同)

rep*_*lay 14

你可以把它放在括号里,比如(cp a b && mv b c && rm a )&包含整个链。

  • 重要的是,这清楚地表明整个链是有背景的,即使对于可能不知道运算符如何有界规则的人 (2认同)
  • 看看我对@Gilles 的回答的评论,我认为 `{ ... ; }` 是一种首选形式(方式)。 (2认同)