redirect both stdout and stderr to same place

Sometimes you might want to redirect both stdout and stderr into same place. You can do it like:

[root@linux ~]# ./script.sh >/dev/null 2>&1

But there is a shorter way…

In the world of Linux and Unix-like operating systems, understanding the concepts of stdout and stderr is fundamental for anyone navigating the command line interface. These terms, shorthand for standard output and standard error, play crucial roles in the communication between processes and users.

Standard output, often abbreviated as stdout, is the default stream where a command or program sends its normal output. When you run a command in the terminal, the results or output are typically directed to the stdout stream. This allows you to see the information produced by the command directly on your screen.

Consider the following command:

[root@linux ~]# echo "Hello, stdout"
Hello, stdout
[root@linux ~]#

In this case, the text “Hello, stdout” is sent to the stdout stream and will be displayed on the terminal.

You can redirect the output to a file using the > operator. For instance:

[root@linux ~]# echo "Hello, stdout" >output.txt
[root@linux ~]#

This command will write the output to a file named output.txt instead of displaying it on the screen.

Standard error, or stderr, is a separate stream used by commands and programs to communicate error messages or diagnostics. When a command encounters an error or wants to provide additional information about its execution, it sends that information to the stderr stream. This allows users to differentiate between regular output and error messages.

Suppose you attempt to remove a file that doesn’t exist:

[root@linux ~]# rm non_existent_file
rm: cannot remove 'non_existent_file': No such file or directory
[root@linux ~]#

In this case, the error message indicating that the file doesn’t exist will be sent to the stderr stream, and it won’t interfere with the regular stdout stream. Similar to stdout, you can redirect stderr to a file using the 2> operator (2 is the file descriptor for stderr). For example:

[root@linux ~]# rm non_existent_file 2>output.txt
[root@linux ~]#

This command redirects the error messages to output.txt

In order to combine those redirections and to redirect both stdout and stderr at once, you can use this:

[root@linux ~]# ./script.sh >output.txt 2>&1

But there is a shorter way to achieve the same result:

[root@linux ~]# ./script.sh &>output.txt

This is shorter and looks more neat!