`nohup`、`&` 和重定向之间的顺序?

`nohup`、`&` 和重定向之间的顺序?

和重定向一起使用时,nohup正确的顺序是什么?&

为什么其他命令不正确?

例如,

$ nohup firefox& &> /dev/null

$ nohup firefox &> /dev/null  &

我不知道如何更改带有重定向的 nohup 和&.

另一个例子,

$ nohup sleep 1000 & &>/dev/null

不重定向到/dev/null,但仍然重定向到./nohup.out

答案1

我将从部分开始外壳文法来自手册页bash

简单命令

A 简单的命令是一系列可选变量赋值,后跟空格分隔的单词和重定向,并由一个终止控制操作员

所以重定向( &>/dev/null) 首先出现,然后控制操作员如下(&)。

编辑:为了使答案完整,这nohup是第一部分简单的命令。它在 中没有任何特殊含义bash

正是你的例子(除了这/dev/null只会让它变得复杂):

jakuje@E6430:/tmp$ rm nohup.out out
jakuje@E6430:/tmp$ nohup sleep 1 & &>out
[1] 10876
nohup: ignoring input and appending output to ‘nohup.out’
[1]+  Done                    nohup sleep 1
jakuje@E6430:/tmp$ cat nohup.out             # empty
jakuje@E6430:/tmp$ cat out                   # empty
jakuje@E6430:/tmp$ rm nohup.out
jakuje@E6430:/tmp$ nohup sleep 1 &>out &
[1] 10882
[1]+  Done                    nohup sleep 1 &> out
jakuje@E6430:/tmp$ cat nohup.out             # no file
cat: nohup.out: No such file or directory
jakuje@E6430:/tmp$ cat out                   # output of nohup
nohup: ignoring input

答案2

nohup命令是您在本例中实际运行的命令。这个词firefox没有被解释通过外壳作为命令;它只是作为参数传递给nohup.该nohup命令对该参数执行的操作“与 shell 无关”。

当然,nohup所做的就是接受该参数并将其作为命令运行。

重点是从 shell 的角度来看,您实际上正在做的是重定向输出nohup不是的输出firefox

但是,nohup将对其运行的命令的输出执行不同的操作,具体取决于其自己的输出指向的位置。来自POSIX 规范nohup(强调):

如果标准输出是终端,所有输出由指定的公用事业其标准输出应附加到当前目录中文件 nohup.out 的末尾。如果无法创建或打开 nohup.out 进行追加,则输出应追加到 HOME 环境变量指定的目录中 nohup.out 文件的末尾。 ...

如果标准错误是一个终端并且标准输出已打开,但不是终端,由命名实用程序写入其标准错误的所有输出都应重定向到与标准输出相同的打开文件描述。 ...

因此,由于 的一些内在魔力nohup,如果您运行以下命令,您的重定向将按预期工作:

nohup utility >/dev/null &

请注意,您不需要同时重定向stderrstdout,因为该nohup命令将重定向stderrof公用事业取决于nohup自己的输出指向的位置。 (更不用说它&>不便携。)

您的输入还存在可移植性问题。由于您stdin已连接到终端,因此具体会发生什么是特定于实现的。 (看nohupPOSIX 规范中“基本原理”下的注释.)相反,你最好使用:

nohup firefox >/dev/null </dev/null &

正如评论中已经提到的,在nohup任何情况下,您都不应该在后台之后放置重定向&

相关内容