什么是/ dev / null 2>& 1?

时间:2012-05-09 01:46:19

标签: shell syntax posix io-redirection

我在/etc/cron.daily/apf

中找到了这段代码
#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

它正在冲洗并重新加载防火墙 我不理解>> /dev/null 2>&1部分。

在cron中有这个的目的是什么?它覆盖了我的防火墙规则。 我可以安全地删除这个cron作业吗?

8 个答案:

答案 0 :(得分:284)

>> /dev/null将标准输出(stdout)重定向到/dev/null,将其丢弃。

>>似乎有点多余,因为>>表示追加而>表示截断和写入,并且追加或写入/dev/null具有相同的网络因为这个原因,我通常只使用>。)

2>&1将标准错误(2)重定向到标准输出(1),然后标准输出也被丢弃,因为标准输出已被重定向。

答案 1 :(得分:106)

让我们将>> /dev/null 2>&1语句分成几部分:

第1部分: >>输出重定向

这用于重定向程序输出并将输出附加到文件的末尾。 More...

第2部分: /dev/null特殊文件

这是 Pseudo-devices special file

命令ls -l /dev/null将为您提供此文件的详细信息:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

您是否观察过crw?这意味着它是伪设备文件,其character-special-file类型提供串行访问。

  

/dev/null接受并丢弃所有输入;不产生输出(总是在读取时返回文件结束指示)。参考:Wikipedia

第3部分: 2>&1文件描述符

无论何时执行程序,操作系统始终会打开三个文件STDINSTDOUTSTDERR,因为我们知道每当打开文件时,操作系统(来自内核) )返回一个非负整数,称为文件描述符。这些文件的文件描述符分别为0,1,2。

所以2>&1只是说将STDERR重定向到STDOUT

  

&表示后面的内容是文件描述符,而不是文件名。

简而言之,通过使用此命令,您告诉您的程序在执行时不要大喊。

使用2>&1的重要性是什么?

如果您想在终端中产生一些错误的情况下不产生输出。为了更清楚地解释,请考虑以下示例:

$ ls -l > /dev/null

对于上面的命令,终端中没有打印输出,但是如果此命令产生错误怎么办:

$ ls -l file_doesnot_exists > /dev/null 
ls: cannot access file_doesnot_exists: No such file or directory

尽管我将输出重定向到/dev/null,但它会在终端中打印出来。这是因为我们没有将错误输出重定向到/dev/null,因此为了重定向错误输出,还需要添加2>&1

$ ls -l file_doesnot_exists > /dev/null 2>&1

答案 2 :(得分:51)

这是静默执行程序的方法,并隐藏其所有输出。

/dev/null是一个特殊的文件系统对象,它会抛弃写入其中的所有内容。将流重定向到它意味着隐藏输出。

2>&1部分意味着"重定向输出和错误流"。即使您的程序写入stderr,也不会显示该输出。

答案 3 :(得分:13)

/dev/null - 标准文件,丢弃您写入的所有内容,但报告    写操作成功。 1是stdout,2是stderr。 2>&1将stderr重定向到stdout。 &1表示文件描述符(stdout),否则(如果仅使用1),则会将stderr重定向到名为1的文件。 [any command] >>/dev/null 2>&1将所有stderr重定向到stdout,并将所有内容写入/dev/null

答案 4 :(得分:7)

让我一点点解释。

0,1,2

0: standard input
1: standard output
2: standard error

>>

>> 中的

command >> /dev/null 2>&1 将命令输出附加到 /dev/null

命令 >> /dev/null 2>&1

  1. 命令后:
command
=> 1 output on the terminal screen
=> 2 output on the terminal screen
  1. 重定向后:
command >> /dev/null
=> 1 output to /dev/null
=> 2 output on the terminal screen
  1. /dev/null 2>&1之后
command >> /dev/null 2>&1
=> 1 output to /dev/null
=> 2 output is redirected to 1 which is now to /dev/null

答案 5 :(得分:5)

我使用>> /dev/null 2>&1作为无声的cronjob,cronjob会完成这项工作,但不会将报告发送到我的电子邮箱。

据我所知,不要删除/dev/null,它特别适用于运行cpanel时,可用于丢弃cronjob报告。

答案 6 :(得分:0)

正如其他人所描述的那样,写入/ dev / null会消除程序的输出。通常,cron会为使用cronjob启动的进程的每个输出发送一封电子邮件。因此,通过将输出写入/ dev / null,如果您在cron中指定了地址,则可以防止发送垃圾邮件。

答案 7 :(得分:0)

修改/etc/conf.apf。设置DEVEL_MODE="0"。设置为DEVEL_MODE的{​​{1}}将在5分钟后添加一个停止apf的cron作业。