什么是/ 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文件描述符

每当你执行一个程序时,默认的操作系统打开三个文件STDINSTDOUTSTDERR正如我们知道的,每当文件被打开时,系统返回一个称为文件描述符的小整数。 这些文件的文件描述符分别是0,1,2。

所以2>&1只是说redirectSTDERRSTDOUT

&意味着以下任何一个文件描述符,而不是文件名。

简而言之,通过使用这个命令,你正在告诉你的程序在执行时不要大喊大叫。

使用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。