和重定向一起使用时,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 &
请注意,您不需要同时重定向stderr
和stdout
,因为该nohup
命令将重定向stderr
of公用事业取决于nohup
自己的输出指向的位置。 (更不用说它&>
不便携。)
您的输入还存在可移植性问题。由于您stdin
已连接到终端,因此具体会发生什么是特定于实现的。 (看nohup
POSIX 规范中“基本原理”下的注释.)相反,你最好使用:
nohup firefox >/dev/null </dev/null &
正如评论中已经提到的,在nohup
任何情况下,您都不应该在后台之后放置重定向&
。