An intro to redirection in Linux

I/O redirection allows us to redirect input and output of commands to and from files, as well as connect multiple commands together into pipelines.

Standard Input, Output, and Error

Output consists of two types

  • The program's results. Known as Standard Output or stdout
  • Status and error messages. Known as Standard Error or stderr

In addition, some programs take input from standard input stdin which by default is attached to the keyboard.

By default, both stdout and stderr are linked to the screen and not saved into a file. Redirection allows us to change where output goes and where input comes from.

Redirecting Standard Output

To redirect stdout to another file instead of the screen, we use the > redirection operator followed by the name of the file.

For example, we could tell the shell to send the output of the ls command to the file ls-output.txt instead of the screen

ls -l /usr/bin > ls-output.txt

We can see that the ls output was not sent to the screen, but to the ls-output.txt file.

Keep in mind that using the redirection operator will overwrite the destination file. To append, we use the >> redirection operator.

Redirecting Standard Error

To redirect stderr we must refer to its file descriptor. The shell references stdout stdin and stderr internal as file descriptors 0, 1, and 2, respectively. We can redirect stderr with this notation:

ls -l /bin/usr 2> ls-error.txt

Redirecting Standard Output and Standard Error to One File

There are two ways to accomplish these, first let's use the traditional method, which works with old versions of the shell:

ls -l /bin/usr > ls-output.txt 2>&1

First we are redirecting stdout to the file ls-output.txt and then we redirect file descriptor 2 stderr to file descriptor 1 stdout using the 2>&1 notation.

Keep in mind that the order of the redirections matter, the redirection of stderr must always occur after redirecting stdout.

Recent versions of bash provide a second, more streamlined method for performing this combined redirection

ls -l /bin/usr &> ls-output.txt

You can still append using the >>

Disposing of Unwanted Output

The system provides a way to redirect output to a special file called /dev/null which is often referred to as a bit bucket. It accepts input and does nothing with it.

ls -l /bin/usr 2> /dev/null

Redirecting Standard Input

Using the < redirection operator, we can change the source of stdin from the keyboard to a file.

cat < sample.txt

Pipelines

Using the pipe operator |, the stout of one command can be piped into the stdin of another. less is an example of this

ls -l /usr/bin | less

it is possible to put several commands together into a pipeline. The commands used this way are referred to as filters. Filters take input, change it somehow and then output it.

The tee command

The tee command reads stdin and copies it to both stdout and to one or more files.

ls /usr/bin | tee ls.txt | grep zip