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


当前回答

让我们把>> /dev/null 2>&1语句分成几个部分:


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

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


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

这是一个伪设备特殊文件。

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

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

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

/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

其他回答

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

据我所知,不要删除/dev/null.它很有用,特别是当你运行cPanel时,它可以用于丢弃cronjob报告。

让我们把>> /dev/null 2>&1语句分成几个部分:


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

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


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

这是一个伪设备特殊文件。

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

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

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

/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

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

让我一点一点地解释。

0,

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

>>

>>命令>> /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

我通常在日志文件中使用该命令,目的是在多个服务器上同时运行脚本时捕捉任何错误以评估/排除问题。

sh -vxe cmd > cmd.logfile 2>&1