Consider a program
hello_and_error that writes to both stdout and to stderr. To redirect both to stdout:
If you want to redirect both to the same file
hello.txt you can do in bash the following:
hello_and_error &> hello.txt
If you want to do this in a more obvious (but longer) way you should do
hello_and_error 1>hello.txt 2>&1
hello_and_error 2>&1 1>hello.txt
The former is semantically equivalent with
hello_and_error &> hello.txt but looks a bit counter-intuitive to me. The latter seems more natural from the point of view of the user: "first merge stderr in stdout and then redirect this combination to a file", but it only redirects the stdout of
hello_and_error to the file and redirects the stderr of
hello_and_error to the stdout of the shell.
The former is probably more natural from the programmer's point of view. I guess you could compare it to the following pieces of (pseudo-)code.
// initialisation to defaults stdout = 1 stderr = 2 // parse redirection stdout = file("hello.txt") stderr = stdout // result: // stdout == file("hello.txt") // stderr == file("hello.txt")
// initialisation to defaults stdout = 1 stderr = 2 // parse redirection stderr = stdout stdout = file("hello.txt") // result: // stdout == file("hello.txt") // stderr == 1
A more in depth view on the redirection: http://www.ss64.com/bashsyntax/redirection.html.