Node:Special FD, Next:Special Process, Previous:Special Files, Up:Special Files
Running programs conventionally have three input and output streams
already available to them for reading and writing. These are known as
the standard input, standard output, and standard error
output. These streams are, by default, connected to your terminal, but
they are often redirected with the shell, via the <
, <<
,
>
, >>
, >&
, and |
operators. Standard error
is typically used for writing error messages; the reason there are two separate
streams, standard output and standard error, is so that they can be
redirected separately.
In other implementations of awk
, the only way to write an error
message to standard error in an awk
program is as follows:
print "Serious error detected!" | "cat 1>&2"
This works by opening a pipeline to a shell command that can access the
standard error stream that it inherits from the awk
process.
This is far from elegant, and it is also inefficient, because it requires a
separate process. So people writing awk
programs often
don't do this. Instead, they send the error messages to the
terminal, like this:
print "Serious error detected!" > "/dev/tty"
This usually has the same effect but not always: although the
standard error stream is usually the terminal, it can be redirected; when
that happens, writing to the terminal is not correct. In fact, if
awk
is run from a background job, it may not have a terminal at all.
Then opening /dev/tty
fails.
gawk
provides special file names for accessing the three standard
streams, as well as any other inherited open files. If the file name matches
one of these special names when gawk
redirects input or output,
then it directly uses the stream that the file name stands for.
These special file names work for all operating systems that gawk
has been ported to, not just those that are POSIX-compliant:
/dev/stdin
/dev/stdout
/dev/stderr
/dev/fd/N
awk
execution (typically
the shell). Unless special pains are taken in the shell from which
gawk
is invoked, only descriptors 0, 1, and 2 are available.
The file names /dev/stdin
, /dev/stdout
, and /dev/stderr
are aliases for /dev/fd/0
, /dev/fd/1
, and /dev/fd/2
,
respectively. However, they are more self-explanatory.
The proper way to write an error message in a gawk
program
is to use /dev/stderr
, like this:
print "Serious error detected!" > "/dev/stderr"
Note the use of quotes around the file name. Like any other redirection, the value must be a string. It is a common error to omit the quotes, which leads to confusing results.