什么是/ dev / null 2>&1?
我在/etc/cron.daily/apf中find这段代码
#!/bin/bash /etc/apf/apf -f >> /dev/null 2>&1 /etc/apf/apf -s >> /dev/null 2>&1
这是冲洗和重新加载防火墙。
我不明白>> /dev/null 2>&1
部分。
在cron中做这个的目的是什么? 这是凌驾于我的防火墙规则。 我可以安全地删除这个cron作业吗?
>> /dev/null
将标准输出( stdout
)redirect到/dev/null
,丢弃它。
( >>
看起来有些多余,因为>>
意思是追加,而>
意味着截断和写入,而追加或写入/dev/null
的效果是一样的,我通常只是使用>
。
2>&1
将标准错误( 2
)redirect到标准输出( 1
),然后由于标准输出已被redirect而丢弃。
这是安静地执行程序并隐藏所有输出的方式。
/dev/null
是一个特殊的文件系统对象,抛出写入它的所有东西。 redirectstream意味着隐藏输出。
2>&1
部分表示“redirect输出和错误stream”。 即使你的程序写入stderr
,那输出也不会显示。
让我们把>> /dev/null 2>&1
语句分成几部分:
第1部分: >>
输出redirect
这用于redirect程序输出并在文件末尾追加输出。 更多…
第2部分: /dev/null
特殊文件
这是一个伪设备专用文件 。
命令ls -l /dev/null
会给你这个文件的详细信息:
crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null
你观察到crw
吗? 这意味着它是一个伪装置文件,它是字符特殊文件types,提供串行访问。
/dev/null
接受并放弃所有input; 不产生输出(总是在读取时返回一个文件结束指示)。 参考: 维基百科
第3部分: 2>&1
文件描述符
每当你执行一个程序时,默认的操作系统打开三个文件STDIN
, STDOUT
和STDERR
正如我们知道的,每当文件被打开时,系统返回一个称为文件描述符的小整数。 这些文件的文件描述符分别是0,1,2。
所以2>&1
只是说redirectSTDERR
到STDOUT
&
意味着以下任何一个文件描述符,而不是文件名。
简而言之,通过使用这个命令,你正在告诉你的程序在执行时不要大喊大叫。
使用2>&1
的重要性是什么?
如果即使在terminal出现错误的情况下也不想输出。 解释让我们看看下面的例子:
$ ls -l > /dev/null
对于上面的命令,terminal中没有输出,但是如果这个命令产生一个错误:
$ ls -l file_doesnot_exists > /dev/null ls: cannot access file_doesnot_exists: No such file or directory
即使我将输出redirect到/dev/null
它也会被打印到terminal中。 这是因为我们没有将错误输出redirect到/dev/null
所以为了redirect错误输出,还需要添加2>&1
$ ls -l file_doesnot_exists > /dev/null 2>&1
/dev/null
– 放弃所有写入的标准文件,但报告写入操作成功。 1
是stdout, 2
是stderr。 2>&1
将stderrredirect到stdout。 &1
表示文件描述符(stdout),否则(如果只使用1
),则将stderrredirect到名为1
文件。 [any command] >>/dev/null 2>&1
将所有stderrredirect到stdout,并将所有这些写入到/dev/null
。
我使用>> /dev/null 2>&1
为沉默的cronjob,cronjob将完成这项工作,但不发送报告给我的电子邮件。
据我所知,不要删除/dev/null
,特别是当你运行cpanel时,可以用来丢弃cronjob报告。
正如其他人所描述的,写入/ dev / null消除了程序的输出。 通常,cron会为从cronjob启动的进程的每个输出发送一封电子邮件。 因此,通过将输出写入/ dev / null,您可以防止在cron中指定您的地址时被垃圾邮件。
编辑/etc/conf.apf
。 设置DEVEL_MODE="0"
。 DEVEL_MODE
设置为1
将在5分钟后添加cron作业以停止apf。