What is the difference between redirection 2>&1 1>file.txt and >a.txt 2>&1?

What is the difference between redirection ./prog 2>&1 1>file.txt and ./prog >a.txt 2>&1? It looks that ./prog 2>&1 1>file.txt doesn't save stderr to file but this ./prog >a.txt 2>&1 does.


Solution 1:

Redirection operators are examined left-to-right, thus

 foo > bar 2>&1

first redirects standard-output to bar and then redirect standard-error to the location where standard-output is redirected at this point (thus bar, too).

 foo 2>&1 > bar

first redirects standard-error to what standard-output points to (most probably the terminal) and then redirects standard-output to bar.

Short: first one redirects both stdout and stderr to bar, second one redirects only stdout to bar and stderr to terminal.