Полезная информация

UNIX Power Tools

UNIX Power ToolsSearch this book
Previous: 12.9 Running Multiple Shell Sessions with screen Chapter 13Next: 13.2 One Argument with a cat Isn't Enough

13. Redirecting Input and Output

Using Standard Input and Output
One Argument with a cat Isn't Enough
Send (only) Standard Error Down a Pipe
Problems Piping to a Pager
Redirection in C Shell: Capture Errors, Too?
Safe I/O Redirection with noclobber
The () Subshell Operators
Using {list} to Group Bourne Shell Commands
Send Output Two or More Places with tee
How to tee Several Commands Into One File
tpipe-Redirecting stdout to More than One Place
Writing to Multiple Terminals for Demonstrations
The "Filename" -
What Can You Do with an Empty File?
What to Do with a Full Bit Bucket :-)
Store and Show Errors with logerrs

13.1 Using Standard Input and Output

There is absolutely no difference between reading data from a file and reading data from a terminal. [1] Likewise, if a program's output consists entirely of alphanumeric characters and punctuation, there is no difference between writing to a file, writing to a terminal, and writing to the input of another program (as in a pipe).

[1] If a program's input consists entirely of alphanumeric characters and punctuation (i.e., ASCII data or international (non-English) characters).

The standard I/O facility provides some simple defaults for managing Input/Output. There are three default I/O streams: standard input, standard output, and standard error. By convention, standard output (abbreviated stdout) consists of all "normal" output from your program, while standard error (stderr) consists of error messages. It is often a convenience to be able to handle error messages and standard output separately. If you don't do anything special, programs will read standard input from your keyboard, and they will send standard output and standard error to your terminal's display.

Standard input (stdin) normally comes from your keyboard. Many programs ignore stdin; you name files directly on their command line - for instance, the command cat file1 file2 never reads its standard input; it reads the files directly. But, without filenames on the command line, UNIX commands that need input will usually read stdin. Standard input normally comes from your keyboard, but the shell can redirect stdin from a file. This is handy for UNIX commands that can't open files directly - for instance, mail (1.33). To mail a file to joan, use filename-to tell the shell to attach the file, instead of your keyboard, to mail's standard input:

% mail joan < myfile

The real virtue of standard I/O is that it allows you to redirect input or output away from your terminal to a file. As we said, UNIX is file-based (1.29). Because terminals and other I/O devices are treated as files, a program doesn't care or even know [2] if it is sending its output to a terminal or to a file. For example, if you want to run the command cat file1 file2, but you want to place the output in file3 rather than sending it to your terminal, give the command:

[2] A program can find out.

% cat file1 file2 > file3

This is called redirecting standard output to file3. If you give this command and look at file3 afterward, you will find the contents of file1, followed by file2-exactly what you would have seen on your screen if you omitted the > file3 modifier.

One of the best-known forms of redirection in UNIX is the pipe. The shell's vertical bar (|) operator makes a pipe. For example, to send both file1 and file2 together in a mail message for joan, type:

% cat file1 file2 | mail joan

The pipe says "connect the standard output of the process at the left (cat) to the standard input of the process at the right (mail)."

Article 45.20 has diagrams and more information about standard I/O and redirection. Table 13.1 shows the most common ways of redirecting standard I/O, for both the C shell and the Bourne shell.

Table 13.1: Common Standard I/O Redirections
Send stdout to fileprog > fileprog > file
Send stderr to fileprog 2> file
Send stdout and stderr to fileprog >& fileprog > file 2>&1
Take stdin from fileprog < fileprog < file
Send stdout to end of fileprog >> fileprog >> file
Send stderr to end of fileprog 2>> file
Send stdout and stderr to end of fileprog >>& fileprog >> file 2>&1
Read stdin from keyboard until c (see article 8.18)prog <<cprog <<c
Pipe stdout to prog2prog | prog2prog | prog2
Pipe stdout and stderr to prog2prog |& prog2prog 2>&1 | prog2

Be aware that:

There are some more complex forms of standard I/O redirection,particularly for the Bourne shell . (45.21, 45.22, 45.23)

Of course, programs aren't restricted to standard I/O. They can open other files, define their own special-purpose pipes, and write directly to the terminal. But standard I/O is the glue that allows you to make big programs out of smaller ones, and is therefore a crucial part of the operating system. Most UNIX utilities read their data from standard input and write their output to standard output, allowing you to combine them easily. A program that creates its own special-purpose pipe may be very useful, but it cannot be used in combination with standard utilities.

Some UNIX systems, and utilities such as gawk (33.12), support special filenames like /dev/stdin, /dev/stdout, and /dev/stderr. You can use these just as you'd use other files. For instance, to have any ordinary command read from the file afile, then standard input (from the keyboard, for example), then the file bfile:

% somecmd afile /dev/stdin bfile

In the same way, a process can write to its standard output through /dev/stdout and the standard error via /dev/stderr.

- ML, JP

Previous: 12.9 Running Multiple Shell Sessions with screen UNIX Power ToolsNext: 13.2 One Argument with a cat Isn't Enough
12.9 Running Multiple Shell Sessions with screen Book Index13.2 One Argument with a cat Isn't Enough

The UNIX CD Bookshelf NavigationThe UNIX CD BookshelfUNIX Power ToolsUNIX in a NutshellLearning the vi Editorsed & awkLearning the Korn ShellLearning the UNIX Operating System