What is /dev/null 2>&1?

2019-01-04 04:51发布

I found this piece of code in /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

It's flushing and reloading the firewall.
I don't understand the >> /dev/null 2>&1 part.

What is the purpose of having this in the cron? It's overriding my firewall rules. Can I safely remove this cron job?

7条回答
放我归山
2楼-- · 2019-01-04 05:01

>> /dev/null redirects standard output (stdout) to /dev/null, which discards it.

(The >> seems sort of superfluous, since >> means append while > means truncate and write, and either appending to or writing to /dev/null has the same net effect. I usually just use > for that reason.)

2>&1 redirects standard error (2) to standard output (1), which then discards it as well since standard output has already been redirected.

查看更多
疯言疯语
3楼-- · 2019-01-04 05:11

I use >> /dev/null 2>&1 for silent cronjob, cronjob will do the job but not send report to my email.

As far as I know, don't remove /dev/null, it's useful especially when you running cpanel, can be used for throw away cronjob report.

查看更多
劫难
4楼-- · 2019-01-04 05:14

Let's break >> /dev/null 2>&1 statement into parts:


Part 1: >> output redirection

This is used to redirect the program output and append the output at the end of the file. More...


Part 2: /dev/null special file

This is a Pseudo-devices special file.

Command ls -l /dev/null will give you details of this file:

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

Did you observe crw? Which means it is a pseudo-device file which is of character-special-file type that provides serial access.

/dev/null accepts and discards all input; produces no output (always returns an end-of-file indication on a read). Reference: Wikipedia


Part 3: 2>&1 file descriptor

Whenever you execute a program, operating system always opens three files STDIN, STDOUT, and STDERR as we know whenever a file is opened, operating system (from kernel) returns a non-negative integer called as File Descriptor. The file descriptor for these files are 0, 1, 2 respectively.

So 2>&1 simply says redirect STDERR to STDOUT

& means whatever follows is a file descriptor, not a filename.

In short, by using this command you are telling your program not to shout while executing.

What is the importance of using 2>&1?

If you want to produce no output even in case of some error produced in the terminal. To explain more clearly, let's consider the following example:

$ ls -l > /dev/null

For the above command, no output was printed in the terminal, but what if this command produces an error:

$ ls -l file_doesnot_exists > /dev/null 
ls: cannot access file_doesnot_exists: No such file or directory

Despite I'm redirecting output to /dev/null, it is printed in the terminal. It is because we are not redirecting error output to /dev/null, so in order to redirect error output as well, it is required to add 2>&1

$ ls -l file_doesnot_exists > /dev/null 2>&1
查看更多
放我归山
5楼-- · 2019-01-04 05:18

Edit /etc/conf.apf. Set DEVEL_MODE="0". DEVEL_MODE set to 1 will add a cron job to stop apf after 5 minutes.

查看更多
\"骚年 ilove
6楼-- · 2019-01-04 05:24

/dev/null - standard file that discards all you write to it, but reports that the write operation succeeded. 1 is stdout and 2 is stderr. 2>&1 redirects stderr to stdout. &1 indicates file descriptor(stdout), otherwise(if you use just 1) you will redirect stderr to file named 1. [any command] >>/dev/null 2>&1 redirects all stderr to stdout, and writes all of that to /dev/null.

查看更多
够拽才男人
7楼-- · 2019-01-04 05:25

This is the way to execute a program quietly, and hide all its output.

/dev/null is a special filesystem object that throws away everything written into it. Redirecting a stream into it means hiding an output.

The 2>&1 part means "redirect both the output and the error streams". Even if your program writes to stderr, that output will not be shown.

查看更多
登录 后发表回答