245

I would like a brief explanation of the following command line:

grep -i 'abc' content 2>/dev/null 
352

The > operator redirects the output usually to a file but it can be to a device. You can also use >> to append.

If you don't specify a number then the standard output stream is assumed but you can also redirect errors

> file redirects stdout to file
1> file redirects stdout to file
2> file redirects stderr to file
&> file redirects stdout and stderr to file

/dev/null is the null device it takes any input you want and throws it away. It can be used to suppress any output.

  • 8
    is there a difference between > /dev/null 2>&1 and &> /dev/null – Alexander Mills Oct 19 '17 at 0:25
  • 15
    In practice today I don't think there is 2>&1 is an older syntax so &> would not have worked years ago but both are equivalent. – Warren Hill Oct 19 '17 at 2:47
28

In short, it redirects stderr (fd 2) to the black hole (discards the output of the command).

Some more common use cases for redirection:

command > /dev/null 2>&1 &

Run command in the background, discard stdout and stderr

command >> /path/to/log 2>&1 &

Run command and append stdout and stderr to a log file.

In Bash 4+, a shorter (but less readable) form is functional

command &>> /path/to/log
  • 3
    Is there a good reason to use > /dev/null 2>&1 instead of &> /dev/null? – Craig McQueen Nov 30 '15 at 6:43
  • 7
    @CraigMcQueen &> is new in Bash 4, the former is just the traditional way, I am just so used to it (easy to remember). – Terry Wang Nov 30 '15 at 12:24
  • @CraigMcQueen according to a comment on this answer, &> /dev/null may not work in some shells but > /dev/null 2>&1 will work in all POSIX compatible shells. – Stack Underflow Jan 6 at 23:41
  • 3
    Why is it 2>&1 and not 2&1> ?? – marienbad Mar 11 at 21:30
  • 1
    @marienbad that's actually a question worth posting :-) The syntax is fn>target, where fn is a file number (0-2 typically, some programs define more numbers) and target is usually a file name but here it is another filenumber - prefixed with & which is the syntax for "I want a filenumber instead of a file name". – toolforger Jun 7 at 4:12
9

/dev/null is treated as black hole in Linux/Unix, so you can put anything into this but you will not be able to get it back from /dev/null.

Further, 2> means that you are redirecting (i.e. >) the stderr (i.e. 2) into the black hole (i.e. /dev/null)

Your command is:

grep -i 'abc' content 2>/dev/null 

Don't try to end with another forward slash like this - 2>/dev/null/ (it's not a directory).

2

grep -i 'abc' content will generate output which is displayed on your console, including any errors.

Specifying 2>/dev/null will filter out the errors so that they will not be output to your console.

In more detail: 2 represents the error descriptor, which is where errors are written to. By default they are printed out on the console.

\> redirects output to the specified place, in this case /dev/null

/dev/null is the standard Linux device where you send output that you want ignored.

protected by Sergiy Kolodyazhnyy Aug 5 at 8:10

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.