The output of a process can be either redirected to a file or to another process i.e., the output of a command will not appear on the screen but will be saved in a file or it can act as an input of another command. The redirection operators like >, >>, &>, 2> etc are used to redirect output to a file and the concept of pipes (|) is used to redirect output to another process.
Before learning how to Redirect Output to a File or Process? let’s understand the basics first.
The figure below shows the channels via which a process can receive input, send output and error messages.
Standard Input (stdin): is the input channel which is used by the process to receive an input. The file descriptor reserved for this channel is ‘0’.
Standard Output (stdout): is the output channel which is used by the process to send an output. The file descriptor reserved for this channel is ‘1’.
Standard Error (stderr): is the channel which is used by the process for an error message. The file descriptor reserved for this channel is ‘2’.
For any communication (either receiving data or sending data) with the user files, file descriptor from 3 onwards are used.
The table below summarizes the channels, their default connection and usage.
|Number||Channel Name||Description||Default Connection||Usage|
|0||stdin||Standard Input||Keyboard||Read only|
|1||stdout||Standard Output||Terminal||Write only|
|2||stderr||Standard Error||Terminal||Write only|
|3+||filename||Other files||none||read and/or write|
By default, the stdout and stderr channels use terminal as the output device. Now if you want that the output of a process is not displayed on the screen, use redirection to save the output in a file.
To redirect output to a file use the ‘>’ symbol followed by the filename. For example,
will save the output of ls command in the file output.txt. Compare the output with using ls alone. If the file doesn’t already exist, using the redirection symbol will create it.
Note: Using the redirection (>), will overwrite the original contents of the file.
If you do not want to overwrite the contents of the existing file then use the double redirection like
will append the output of date command to the original contents of the file output.txt.
Just as redirecting the output, it is also possible to redirect the error from a process into a file.
Now, instead of using just the ‘>’ symbol use ‘2>’ followed by file name. For example, suppose a file ‘file.txt’ does not exist in your system. So if you use
it will show an eror
ls: cannot access 'file.txt': No such file or directory
Now, if you want to save this error message into a file, you need to redirect the stderr into a file like,
$ls file.txt 2>output.txt
Now, check the content of output.txt. The error message will be here.
This option allows to discard error messages. So the only change required is instead of giving a file name to store the file just write /dev/null. Foe example
$ls file.txt 2>/dev/null
Next, both the stdout and stderr can be redirected towards the same file. To do this use ‘&>filename’. For example
$ls file.txt &>output.txt
Now, it doesn’t matter whether file.txt exists or not. In either case the output will be in output.txt. So, execute the above command in two ways:
1) when file.txt doesn’t exist
2) create the file file.txt and then rerun the command.
Now, the last thing is if you want to redirect stdout and stderr into the same file and append it to the existing contents of the target file. The method will be:
$ls file.txt >>output.txt 2>&1
Pipes are used to send output of a process to another process i.e., the Output of one process becomes the input of another process. The symbol used is ‘|’.
For example, if you want to count the number of files and sub-directories in your current working directory, you will have to use the following combination of commands
$wc -l file1
The output of ls command i.e., all the files and sub-directories gets saved in file1. Then we count the number of lines using wc -l, which gives the count of total number of files and sub-directories. The alternative is, use pipes
$ls | wc -l
Now, the output of ls is send as an input to the wc -l command.
Q1. Show the first ten entries of the ls command output.
$ls | head
Q2. Sort the output of ls command output as per the months and save the output in the file result.txt
$ls | sort -M > result.txt
Q1. Write the command to display only the 6th and 7th lines of a file.
Q2. Write the command to display the output of ls command on the screen and also save the output in a file result.txt.