347

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

4

8 回答 8

480

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

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

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

于 2012-05-09T01:49:42.013 回答
363

让我们将>> /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将流 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
于 2017-03-21T06:35:38.127 回答
85

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

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

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

于 2012-05-09T01:49:13.433 回答
24

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

0,1,2

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

>>

>>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
  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
于 2020-12-25T00:59:15.340 回答
22

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

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

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

于 2015-03-10T12:40:48.647 回答
8

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

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

于 2013-06-08T06:29:34.997 回答
2

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

于 2012-10-03T20:13:31.117 回答
-2

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

于 2013-04-15T23:01:11.860 回答