As you use Linux, you may come across references to "standard I/O," or "standard input," "standard output," and "standard error." What do these terms mean?

Standard Input

Standard input is a term for the input that a command-based program receives. In interactive use, it is normally from the keyboard, but as you'll see later, it can also come from a file.

While the keyboard these days is usually plugged directly into the machine, when text terminals were more common, standard input was taken from the terminal keyboard connected to a central minicomputer or mainframe. Modern Linux systems use terminal emulators or the system console for standard input.

Standard Output

Standard output, like standard input, is where a program will send its text output. Again, this is typically a terminal emulator on modern systems but in the past was also on physical terminals, either with CRT screens or printed on paper using teletypes.

Teletype terminals were more common when Linux's predecessor, Unix, was being developed at Bell Labs in the late 1960s and early 1970s.

Related: Why Are Linux Commands So Short? The History of Linux Commands

Like standard input, you can also redirect standard output to a file.

Standard Error

Standard error is usually used for any error messages a program may generate. As with standard output, it is usually displayed on the screen but can also be redirected to a file or to a block device like /dev/null.

How to Redirect Input and Output on Linux

One of the most powerful features of Linux and Unix systems is the ability to redirect input and output to files and other programs.

The most widely used method is to send the output from one command to another, or a "pipeline." For example, to see how many Linux commands have "sh" in their name, you can pipe the output of the ls command with grep.

        ls /bin | grep 'sh'
    
A linux command pipeline

To redirect the output from a command to a file, use the > operator. For example, to send the output of the ls command into a file name filelist:

        ls > filelist
    

The >> operator appends the output to an existing file or creates it if it doesn't exist. To prevent accidentally overwriting a file, you can set the "noclobber" option in Bash:

        set noclobber
    

You can also have a program take input from a file with the < operator. The cat program can print the contents of a file by taking input from the file and sending the output to standard output.

        cat < file
    

Of course, you can just use cat and specify the file path as an argument, but this is just an example.

You can redirect standard error using a file descriptor, or a number that stands for one of the forms of standard I/0. With file descriptors, 0 is standard input, 1 is standard output, and 2 is standard error. The syntax in Bash is [file descriptor]>. It's useful to redirect standard error to /dev/null to get rid of errors:

        linux_command 2> /dev/null
    

You can redirect both standard output and input at once with &>, which is useful if you need to send an email or forum post describing a problem you're having with a program:

        linux_command &> file
    

Standard I/O Works Everywhere

Even with the graphical environments available today, standard I/O remains important because it's still the universal interface, from desktop to server to mobile, being based on ASCII text.