Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Occasionally I need to specify a "path-equivalent" of one of the standard IO streams (stdin, stdout, stderr). Since 99% of the time I work with Linux, I just prepend /dev/ to get /dev/stdin, etc., and this "seems to do the right thing". But, for one thing, I've always been uneasy about such a rationale (because, of course, "it seems to work" until it doesn't). Furthermore, I have no good sense for how portable this maneuver is.

So I have a few questions:

  1. In the context of Linux, is it safe (yes/no) to equate stdin, stdout, and stderr with /dev/stdin, /dev/stdout, and /dev/stderr?

  2. More generally, is this equivalence "adequately portable"?

(I cringed as I wrote the last question, because I wish I could make it less subjective...)

I tried Googling these questions, including terms like POSIX among my search terms, but none of the top hits I got were particularly germane or authoritative.

share|improve this question
up vote 16 down vote accepted

It's been available on Linux back into its prehistory. It is not POSIX, although many actual shells (including AT&T ksh and bash) will simulate it if it's not present in the OS; note that this simulation only works at the shell level (i.e. redirection or command line parameter, not as explicit argument to e.g. open()). That said, it should be available on most commercial Unix systems, one way or another (sometimes it's spelled /dev/fd/N for various integers N, but most systems with that will provide symlinks as Linux and *BSD do).

share|improve this answer
Indeed, /dev/std{in,out,err} are specifically listed as not part of the POSIX.1-2008 standard. – jw013 Apr 13 '12 at 23:05

the /dev/std{in,out,err} files are normally just symlinks to /proc/self/fd/{0,1,2} (respectively). As such theres nothing gained over using methods that are POSIX defined.

If you want to be POSIX compliant, the best way to do this is to use output redirection. Shell output redirection is defined in the POSIX standard. Additionally the STDIN, STDOUT, STDERR file descriptor numbers are also part of POSIX.
In short, things like >&2 are guaranteed to work.

One important thing to note though is that usage of STDIN, STDOUT, and STDERR is subjective to how the program was started. If the program was started with file descriptor 1 being an open handle to a file, then your program just has to accept it. Even if you were to have the program open up /dev/stdout, all it would do is open up file descriptor 1 which is still going to point to that file.
If this is what youre trying to get around, you need to open the TTY directly. Normally, without any redirection going on, STDIN, STDOUT, and STDERR are all just open file descriptors pointing to the same TTY. There is absolutely nothing more to it than that.

share|improve this answer
+1, especially for the "one important thing" part; I'm going to digest this in parts :) – Alois Mahdal Apr 15 '12 at 13:22
Can you clarify if /proc/self/fd/1 or /dev/fd/1 are part of POSIX? – Steven Penny Jun 15 '14 at 2:32

It should be available on all Linuxes. Linux 4.1 Documentation/devices.txt says:

    Compulsory links

These links should exist on all systems:

/dev/fd     /proc/self/fd   symbolic    File descriptors
/dev/stdin  fd/0        symbolic    stdin file descriptor
/dev/stdout fd/1        symbolic    stdout file descriptor
/dev/stderr fd/2        symbolic    stderr file descriptor
/dev/nfsd   socksys     symbolic    Required by iBCS-2
/dev/X0R    null        symbolic    Required by iBCS-2

I could not however find where those symlinks are created on the kernel.

I could not however find it mentioned even on the LSB.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.