Understanding ‘stdin’, ‘stdout’ and ‘stderr’ in Linux

Updated: January 28, 2024 By: Guest Contributor Post a comment

Introduction

Linux is renowned for its efficiency and flexibility when handling processes. A fundamental concept that facilitates this is the standard streams, namely stdin, stdout, and stderr. Each of these streams is used for different types of interaction with running processes in the shell environment.

What are Standard Streams?

In Linux, a stream is an abstract interface used for I/O operations. There are three predefined streams:

  • stdin (Standard Input): Stream data into a program. (represented as file descriptor 0).
  • stdout (Standard Output): Output data produced by a program. (file descriptor 1).
  • stderr (Standard Error): Output error messages. (file descriptor 2).

Standard Input (stdin)

The standard input is the default source of input for programs and typically originates from the keyboard. However, its source can be changed using redirection or piping. For example:

echo "Enter your name:" 
read name 
echo "Hello, $name"

In this code snippet, the read command gets the user’s input from the standard input.

Redirecting stdin

You can redirect stdin from a file like so:

./your_script.sh < inputfile.txt

This command will feed the contents of inputfile.txt into your_script.sh as if it was typed by the user.

Standard Output (stdout)

The standard output stream is used to output data that is processed by the program. By default, this is the screen. Here’s an example:

echo "This will go to the standard output."

This simply prints the text to your terminal, which is your typical stdout.

Redirecting stdout

To redirect stdout to a file, use the > operator:

echo "This will be written to file.txt" > file.txt

This will create a file named file.txt and write the output there instead of to the terminal screen.

Standard Error (stderr)

The standard error stream is used by programs to output error messages. By default, stderr is also displayed on the screen.

ls /unexistingdirectory 2>&1

This command attempts to list the contents of a non-existent directory, and redirects the resulting error message from stderr to stdout, which is shown on the terminal.

Redirecting stderr

To redirect stderr to a file, use the 2> operator:

grep 'text' non_existing_file.txt 2> errors.txt

Here, grep will search for ‘text’ in a file that does not exist, and the error will be written to errors.txt.

Combining stderr and stdout

You can redirect both stdout and stderr to the same file:

./run_some_script.sh >log.txt 2>&1

In this example, both standard output and standard error will be redirected to log.txt.

Advanced Uses

Now that we’ve covered the basics, let’s dive into some advanced uses for these streams.

Pipelines

You can chain multiple commands using the pipe (|) operator, passing the stdout of one process to the stdin of the next:

cat file.txt | grep 'text' | sort > sorted_results.txt

This command sequence uses cat to print file.txt, greps for lines that contain ‘text’, sorts them, and then writes the output to sorted_results.txt.

Process Substitution

Bash’s process substitution allows for more complex interactions:

diff <(command1) <(command2)

This treats the outputs of both commands as files and diffs them.

Conclusion

In summary, understanding stdin, stdout, and stderr is vital for efficient command-line operations in Linux. These streams allow for powerful manipulation and redirection of data flow in shell scripting and command-line activities. Grasping these principles will improve your ability to control and interface with your operating system at a much more profound level.