STDIN, STDOUT, and STDERR are three essential concepts in Linux and Unix-like operating systems that are used to manage input and output streams for running processes. These streams allow command-line programs and scripts to interact with the user and communicate results, and are represented by numeric file descriptors 0, 1, and 2 respectively.
In this article, we’ll explore these streams in more detail and show how they can be used in practice.
STDIN (standard input) is the default input stream for a running process. It provides a way for a program to read input data from the user or another program. By default, STDIN is connected to the keyboard, so when a program reads from STDIN, it reads data typed by the user.
For example, let’s say you want to read a file line by line in a script. You can use the read
command to read input from STDIN and assign it to a variable:
while read line; do
echo $line
done < file.txt
In this example, the while
loop reads input from STDIN (which is redirected to the file file.txt
using the <
operator) and assigns it to the line
variable. The echo
command then prints the line to STDOUT.
STDOUT (standard output) is the default output stream for a running process. It provides a way for a program to send output data to the user or another program. By default, STDOUT is connected to the console or terminal, so when a program writes to STDOUT, the output is displayed on the screen.
For example, let’s say you want to list the files in a directory and save the output to a file. You can use the ls
command to list the files and redirect the output to a file using the >
operator:
ls > files.txt
In this example, the ls
command writes the output to STDOUT, which is then redirected to the file files.txt
using the >
operator. The file will contain a list of the files in the directory.
STDERR (standard error) is the default error stream for a running process. It provides a way for a program to send error messages and diagnostic output to the user or another program. By default, STDERR is connected to the console or terminal, so when a program writes to STDERR, the output is displayed on the screen along with any regular output sent to STDOUT.
For example, let’s say you want to run a command that generates an error message. You can use the ls
command with an invalid option to generate an error:
ls -z
In this example, the ls
command generates an error message because the -z
option is not valid. The error message is sent to STDERR, which is displayed on the screen along with any regular output sent to STDOUT.
Redirecting Output Streams
In addition to the default behavior of STDIN, STDOUT, and STDERR, it’s possible to redirect these streams to other sources using special operators in the command line.
To redirect STDOUT to a file, use the >
operator followed by the name of the file. For example:
ls > files.txt
To redirect STDERR to a file, use the 2>
operator followed by the name of the file. For example:
ls -z 2> errors.txt
To redirect both STDOUT and STDERR to a file, use the &>
operator followed by the name of the file. For example:
ls -z &> output.txt
``
It’s also possible to redirect input from a file to STDIN using the <
operator. For example:
while read line; do
echo $line
done < file.txt
In this example, the <
operator redirects input from the file file.txt
to STDIN, which is read by the read
command in the loop.
Combining and Piping Output Streams
In addition to redirection, it’s possible to combine and pipe output streams using special operators and commands.
To combine STDOUT and STDERR into a single stream, use the 2>&1
operator. For example:
ls -z &> output.txt
In this example, the &>
operator redirects both STDOUT and STDERR to the file output.txt
. The 2>&1
operator redirects STDERR to the same place as STDOUT, which means both streams are combined into a single output file.
To pipe the output of one command to another command, use the |
operator. For example:
ls | grep txt
In this example, the output of the ls
command is piped to the grep
command, which searches for lines containing the text “txt”. The result is a list of files with “txt” in their name.
Conclusion
In this article, we’ve explored the concepts of STDIN, STDOUT, and STDERR in Linux and Unix-like operating systems. These input and output streams are essential for running command-line programs and scripts, and understanding how they work is key to becoming proficient with the command line.
We’ve covered the basics of STDIN, STDOUT, and STDERR, as well as redirection, combining, and piping output streams. We’ve also provided some examples and commands to help you get started.
If you’re interested in learning more about the command line, we recommend checking out some of the resources listed below:
- The Linux Documentation Project: Introduction to the Command Line
- The Bash Guide for Beginners
- The GNU Bash manual
As Linus Torvalds, the creator of Linux, said “Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.”