I have been trying to figure out the relationship between file descriptors. One thing I don't understand is, how is:
ls -l /bin/usr > ls-output.txt 2>&1
different from:
ls -l /bin/usr 2>&1 >ls-output.txt
I have been trying to figure out the relationship between file descriptors. One thing I don't understand is, how is:
ls -l /bin/usr > ls-output.txt 2>&1
different from:
ls -l /bin/usr 2>&1 >ls-output.txt
The order of the redirection is important as they are executed sequentially:
stdout
(fd 1
) will point to filename
and afterwards the stderr
(fd 2
) will point to the the target of stdout
in this example filename
.
That means that both stdout
and stderr
get redirected to filename
Here stderr
(fd 2
) will point to the target of stdout
and afterwards stdout
(fd 1
) will redirect to filename.
This means that stderr
will redirect to the original target of stdout
and stdout
gets redirected to filename
.
So in short the order of redirects is important as each filedescriptor is independent of each other.
For further information have a look at some other questions and answers such as:
They're not.
a>&b redirects fd a to fd b. if a is not given, 1 is assumed. 1 is stdout and 2 is stderr.
Some shells (e.g. Bash) also let you specify &> file to redirect both at the same time. However, > 2>&1 is more portable.