Os redirecionamentos são processados da esquerda para a direita. Quando você executa:
ls -l /bin >ls-output.txt 2>&1
o shell realiza aproximadamente as seguintes operações internamente:
fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);
Em seguida, ele executa o comando ls -l /bin
com esses anexos de descritor no lugar. Como você redireciona stdout
para o arquivo primeiro, o redirecionamento de stderr
herda esse redirecionamento.
Se você fosse escrever
ls -l /bin 2>&1 >ls-output.txt
A ordem das operações seria invertida:
// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
Isso conecta stderr
ao original stdout
, que provavelmente será o terminal. Em seguida, ele redireciona stdout
para um arquivo; isso não tem efeito em stderr
.