Background of this post:
Recently, I always noticed that many guys can't distinguish the meaning among stdin, stdout, and stderr, especially, they always ask the same question as: what does "2>&1" exactly mean?
So, here I want to give a summary of this three things, and of course, I'd like to take this "2>&1" as an example.
-----------------------
Interpretation:
First of all, I want to give out the exact meaning of "2>&1":
2>&1:
0 is stdin. 1 is stdout. 2 is stderr
-------------
There's one way to remember this construct (maybe it is not entirely accurate):
-------------
First of all, 2>1 looks like a very good way to redirect stderr to stdout. but remember, it has a very harmful disadvantage: it may actually be interpreted as "redirect stderr to a file named 1".
-------------
& indicates that what follows is a file descriptor and not a filename. So the construct becomes: 2>&1.
-------------
>& is shell syntax for "fold a file descriptor into another", you can also interprete it as "it is the syntax to redirect a stream to another file descriptor"
So, now, have you got the meaning of what does "2>&1" exact mean? I think you do!
Yes, it's very easy to understand, but what's more, I want to go little deep into this topic.
-----------------------
Furthermore:
Following picture gives a very clear defination of what is stdin stdout and stderr:
# In Linux everything is a file.
# Your hardware is also a file:
* 0 - Input - Keyboard (stdin)
* 1 - Output - Screen (stdout)
* 2 - Error - Screen (stderr)
# For standard output:
Clear enough?
If you still feel confused about this, you can view this page to find more infomation:
http://tldp.org/LDP/abs/html/io-redirection.html
-----------------------
Example:
Finally, I want to give you a example to end this entry(Try to understand it ^_^):
The output of a.out is the following, without the 'STDXXX: ' prefix.
STDERR: stderr output
STDOUT: more regular
./a.out 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
more regular
stderr output
- First save stdout as &3 (&1 is duped into 3).
- Next send stdout to stderr (&2 is duped into 1).
- Send stderr to &3 (stdout) (&3 is duped into 2).
- close &3 (&- is duped into 3)
-----------------------
Others:
If you want to know what's the difference between "cmd >file 2>&1" and "cmd >file 2>file", pls refer this post which written by r2007:
http://bbs.chinaunix.net/thread-764727-1-1.html