Skip to content
On this page

Input and Output in Linux

In Linux, input and output are essential concepts that allow you to interact with the system and process data. Understanding how input and output work in the Linux environment is crucial for working effectively in the terminal.

Standard Input, Output, and Error

There are three standard streams in Linux: STDIN (Standard Input), STDOUT (Standard Output), and STDERR (Standard Error). These streams are used to handle input, output, and error messages when running programs and commands.

  • STDIN is the standard input stream that reads data from the keyboard or another program. Number 0 represents the STDIN stream.
  • STDOUT is the standard output stream that displays the output of a program or command. Number 1 represents the STDOUT stream.
  • STDERR is the standard error stream that displays error messages and diagnostic information. Number 2 represents the STDERR stream.

By default, STDIN is connected to the keyboard, and STDOUT and STDERR are connected to the terminal. This means that when you run a command in the shell, the input comes from the keyboard, and the output and error messages are displayed on the terminal.

A good practice is to separate error messages from regular output so that you can easily identify and handle errors. But some programs may not follow this convention, and error messages may be mixed with regular output.

Input Redirection

In Linux, input redirection allows you to control where the input comes from. By default, when you run a command in the shell, STDIN is connected to the keyboard.

Input redirection allows you to change where the command reads its input from. You can redirect the input to come from a file instead of the keyboard.

To redirect the input to come from a file, you use the less-than symbol (<) followed by the name of the file. For example, to read input from a file called input.txt, you would use the following command:

sh
command < input.txt

Here's an example of how input redirection works in real-world scenarios. Let's say you have a file named data.txt that contains a list of names and you want to count the number of names in the file using the wc command. Instead of manually typing each name in the terminal, you can redirect the input to come from the file. By executing the command wc -l < data.txt, the wc command will read the contents of data.txt as input and count the number of lines, which represents the number of names in the file. This way, you save time and effort by not having to manually enter the names. The content of the data.txt file could look something like this:

John Doe
Jane Smith
Michael Johnson
Emily Brown
William Davis

In this case, the file contains a list of 5 names, each on a separate line. By redirecting the input to come from the file, the wc command will count the number of lines in the file and display the result.

The double less-than symbol (<<) is used for a here document, which allows you to provide input to a command interactively. For example:

sh
command << EOF
This is some input.
EOF

In this case, the input is provided interactively between the << and EOF markers. This can be useful when you need to provide multiple lines of input to a command.

Output Redirection

Output redirection allows you to change where the command sends its output. You can redirect the output to go to a file instead of the terminal.

To redirect the output to go to a file, you use the greater-than symbol (>) followed by the name of the file. For example, to redirect the output to a file called output.txt, you would use the following command:

sh
command > output.txt

Note: > is a simplification of 1>, which redirects STDOUT to a file. If you want to redirect STDERR to a file, you can use 2>.

If you want to append the output to an existing file instead of overwriting it, you can use the double greater-than symbol (>>) instead of the single greater-than symbol (>). For example:

sh
command >> output.txt

The ampersand symbol (&) refers to a file descriptor. In the context of output redirection, 1 represents STDOUT, and 2 represents STDERR. By combining the file descriptors with the redirection symbols, you can redirect both STDOUT and STDERR to the same file. For example:

sh
command > output.txt 2>&1

Let's break down the command:

  • command is the command you want to run.
  • > (same as 1>) redirects the STDOUT stream to the file output.txt.
  • 2> redirects the STDERR stream to somewhere.
  • &1 refers to the file descriptor 1, which is STDOUT.

By combining 2> and &1, you redirect STDERR to the same location as STDOUT, which in this case is the file output.txt.

Combining Input and Output Redirection

You can combine input and output redirection to both read from a file and write to a file at the same time. For example:

sh
command < input.txt > output.txt

By using input and output redirection, you can control where the input comes from and where the output goes to, making your shell commands more flexible and powerful.

Using Pipes to Connect Commands

Pipes are a powerful feature in Linux that allow you to connect multiple commands and create complex command sequences. Using pipes can greatly enhance your productivity and efficiency when working in the terminal.

A pipe is represented by the vertical bar symbol |. It allows the output of one command to be redirected as the input to another command. This enables you to chain together multiple commands and perform operations on the data flowing between them.

For example, let's say you have a directory with a large number of text files and you want to find the word count for each file. You can use the ls command to list all the files in the directory, then pipe the output to the wc command to count the words. The command would look like this:

sh
ls | wc -w

In this example, the ls command lists all the files in the directory and the pipe symbol | redirects the output to the wc command. The wc command then counts the words in the input and displays the result.

Pipes can be used with any command that produces output. They allow you to create powerful combinations of commands and perform complex tasks with ease.

Another common use case for pipes is filtering and processing text. For example, you can use the grep command to search for a specific pattern in a file, and then pipe the output to the sort command to sort the lines. The resulting output can then be redirected to a new file or displayed on the screen.

Here's an example:

sh
grep 'error' log.txt | sort > errors.txt

In this example, the grep command searches for lines containing the word error in the file log.txt, and the pipe redirects the output to the sort command. The sort command then sorts the lines alphabetically and the > symbol redirects the output to the file errors.txt.

Using pipes to connect commands allows you to build complex command sequences and automate repetitive tasks. It gives you the flexibility to perform operations on the output of one command before passing it to the next command, enabling you to create powerful data pipelines.

Conclusion

Input and output are fundamental concepts in Linux that allow you to interact with the system and process data. By understanding how input and output redirection, pipes, and streams work, you can work more effectively in the terminal and perform a wide range of tasks efficiently.