Parameter | Details |
---|---|
internal file descriptor | An integer. |
direction | One of > , < or <> |
external file descriptor or path | & followed by an integer for file descriptor or a path. |
UNIX console programs have an input file and two output files (input and output streams, as well as devices, are treated as files by the OS.) These are typically the keyboard and screen, respectively, but any or all of them can be redirected to come from — or go to — a file or other program.
STDIN
is standard input, and is how the program receives interactive input. STDIN
is usually assigned file descriptor 0.
STDOUT
is standard output. Whatever is emitted on STDOUT
is considered the "result" of the program. STDOUT
is usually assigned file descriptor 1.
STDERR
is where error messages are displayed. Typically, when running a program from the console, STDERR
is output on the screen and is indistinguishable from STDOUT
. STDERR
is usually assigned file descriptor 2.
The order of redirection is important
command > file 2>&1
Redirects both (STDOUT
and STDERR
) to the file.
command 2>&1 > file
Redirects only STDOUT
, because the file descriptor 2 is redirected to the file pointed to by file descriptor 1 (which is not the file file
yet when the statement is evaluated).
Each command in a pipeline has its own STDERR
(and STDOUT
) because each is a new process. This can create surprising results if you expect a redirect to affect the entire pipeline. For example this command (wrapped for legibility):
$ python -c 'import sys;print >> sys.stderr, "Python error!"' \
| cut -f1 2>> error.log
will print "Python error!" to the console rather than the log file. Instead, attach the error to the command you want to capture:
$ python -c 'import sys;print >> sys.stderr, "Python error!"' 2>> error.log \
| cut -f1