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

res*_*ing 199 syntax shell 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  
Run Code Online (Sandbox Code Playgroud)

它正在刷新并重新加载防火墙.
我不明白这一>> /dev/null 2>&1部分.

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

zig*_*igg 307

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

(>>看起来有点多余,因为>>意味着追加>意味着截断和写入,并且追加或写入/dev/null具有相同的净效果.我通常只是>因为这个原因使用.)

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

  • &表示文件描述符.通常有3个文件描述符 - 标准输入,输出和错误. (10认同)
  • 如果&表示文件描述符,那么为什么2前面没有&呢? (5认同)
  • “&”符号在“ 2>&1”中指示什么。 (4认同)
  • @没有人检查我下面的答案以了解您的问题/sf/ask/735619041/?noredirect=1#answer-42919998 (2认同)
  • 以防万一其他人没有阅读下面解释文件描述符的答案:“重定向数据流时,&意味着后面的内容是文件描述符,而不是文件名。” (2认同)

Vis*_*ant 151

让我们把>> /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
Run Code Online (Sandbox Code Playgroud)

你有没有观察到crw?这意味着它是一个伪设备文件,它是字符特殊文件类型,提供串行访问.

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


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

无论何时执行程序,操作系统总是打开三个文件STDIN,STDOUT并且STDERR正如我们所知,无论何时打开文件,操作系统(来自内核)都会返回一个称为文件描述符的非负整数.这些文件的文件描述符分别为0,1,2.

所以2>&1简单地说重定向STDERRSTDOUT

& 意味着以下是文件描述符,而不是文件名.

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

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

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

$ ls -l > /dev/null
Run Code Online (Sandbox Code Playgroud)

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

$ ls -l file_doesnot_exists > /dev/null 
ls: cannot access file_doesnot_exists: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

$ ls -l file_doesnot_exists > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

  • 好的例子!不知道 '>' 之前不会重定向 'STDERR'。 (5认同)
  • 我只是想知道为什么我们之前也没有使用'&'.有人可以清楚我的怀疑吗? (3认同)
  • @SnehasishKarmakar 一个合理的问题。我相信操作系统足够聪明,可以理解第一个参数将是一个文件描述符,但 `>` 是一个重定向操作符,重定向操作符后面的任何内容都应该是一个文件位置,在 `1` 之前添加 `&` 表示它不是一个应用程序必须重定向输出但文件描述符的文件。如果有人可以添加此评论的更多详细信息,我将不胜感激。 (3认同)

das*_*ght 53

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

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

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

  • 实际上,`2>&1`实际上将`stderr`重定向到`stdout`.通过交换重定向的顺序,例如"2>&1>/dev/null",可以最好地说明这与您声称的内容之间的区别. (34认同)

小智 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.


shi*_*hin 10

让我一点一点地解释一下。

0,1,2

0: standard input
1: standard output
2: standard error
Run Code Online (Sandbox Code Playgroud)

>>

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

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

  1. 命令后:
command
=> 1 output on the terminal screen
=> 2 output on the terminal screen
Run Code Online (Sandbox Code Playgroud)
  1. 重定向后:
command >> /dev/null
=> 1 output to /dev/null
=> 2 output on the terminal screen
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)


小智 5

>> /dev/null 2>&1用于无声的cronjob,cronjob将完成这项工作但不向我的电子邮件发送报告.

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