Redirecting output streams in bash
In Bash and other Linux shells, when a program is executed, it uses three standard I/O streams. Each stream is represented by a numeric file descriptor:
0 - stdin, the standard input stream.
1 - stdout, the standard output stream.
2 - stderr, the standard error stream.
A Linux stream is data traveling in a Linux shell from one process to another through a pipe, or from one file to another as a redirect. The input stream provides information to the program, generally using the keyboard. The program output goes to the standard output stream and error messages go to the standard error stream. By default, both streams are printed on the screen.
Redirecting the output
Redirection is a way to capture program output and send it as input to another program or file. Streams can be redirected using a special operator and file descriptor number. When the number is omitted, it defaults to 1, the standard output stream.
Following two commands do the same, both will redirect the command output to a file:
command > file
command 1> file
To redirect the standard error to a file use the operator below:
command 2> file
Error messages can be ignored redirecting them to /dev/null:
command 2> /dev/null
Both outputs can be used together:
command 2> error_file > output_file
Redirecting stderr to stdout
When redirecting the output of a command you might notice that error messages are printed on the screen. It's quite common to redirect stderr to stdout when saving to file so you have everything in one place.
To redirect stdout to a file and stderr to the current location of stdout use the following command:
command > file 2>&1
Note: redirection order is important as stderr can be wrongly redirected before defining desired stdout.
Another way to redirect stderr to stdout is using &> operator:
command &> file
In Bash &> has the same meaning as 2>&1.
Conclusion
Understanding redirections and file descriptors is very important when working with the command line. It's common to pipe processes redirecting outputs to other commands input or saving execution results to a file.
0 Comments