I would like a brief explanation of the following command line:
grep -i 'abc' content 2>/dev/null
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.
Sign up to join this communityThe >
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
> file 2>&1
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.
Note that > file 2>&1
is an older syntax which still works, &> file
is neater, but would not have worked on older systems.
> /dev/null 2>&1
and &> /dev/null
Oct 19, 2017 at 0:25
2>&1
is an older syntax so &>
would not have worked years ago but both are equivalent.
Oct 19, 2017 at 2:47
foobar 2&1> file
does not work. It will send the foobar 2
command to background and then run the command 1
, which will fail, it will also not redirect any output. You want foobar > /dev/null 2&>1
or the shorter (and imo clearer): foobar &> /dev/null
.
&>
appears to work in bash
and zsh
but not sh
, csh
, or ksh
. (I know, I know, this is AU, not U&L, and this info is probably of little value.)
Feb 11, 2022 at 2:23
In short, it redirects stderr
(fd
2) to the black hole (discards the output of the command).
Some commonly used pattern for redirection:
command > /dev/null 2>&1 &
Run command
in the background, discard stdout
and stderr
command >> /path/to/log 2>&1 &
Run command
, append stdout
and stderr
to a log file.
In Bash 4+, a shorter (but less readable) form is functional
command &>> /path/to/log
> /dev/null 2>&1
instead of &> /dev/null
?
Nov 30, 2015 at 6:43
&>
is new in Bash 4, the former is just the traditional way, I am just so used to it (easy to remember).
Nov 30, 2015 at 12:24
&> /dev/null
may not work in some shells but > /dev/null 2>&1 will work in all POSIX compatible shells.
Jan 6, 2019 at 23:41
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".
Jun 7, 2019 at 4:12
/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).
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.
First we need to talk about >
operator. It redirect the output of left of symbol to right of symbol.
So it must thought as :
source_command > target_file
Other things that we must know
0 means stdin
1 means stdout(useful output)
2 means stderr(error message output)
As default, it works as command 1 > target_file
As to /dev/null
--> it is a special file that discards channel output redirect to it.
So in your question it means
Run the command and do not show me the error messages, discard them.