A ordem é importante. O shell processa os redirecionamentos de arquivos na ordem em que são visualizados. Considere:
cat >file.txt 2>&1
Primeiro, a stdout é redirecionada para o arquivo file.txt
. Em seguida, stderr é redirecionado para stdout, que é file.txt
. Assim, stdout e stderr são enviados para file.txt
.
Por contraste, considere:
cat >file.txt 1>&2
Primeiro, a stdout é redirecionada para o arquivo file.txt
. (Ao fazer isso, file.txt
é criado como um arquivo vazio.) Em seguida, o stdout é redirecionado para stderr. Assim, stdout vai para stderr e nada vai para file.txt
e, portanto, file.txt
permanece como um arquivo vazio.
Outro caso interessante
Considere:
cat 2>&1 >file.txt
Primeiro, o stderr é redirecionado para o stdout, que ainda é o terminal. Em seguida, o stdout é redirecionado para file.txt
. Este segundo redirecionamento não afeta o stderr. Ainda é enviado para o terminal. Não é enviado para file.txt
.
Documentação
Esse comportamento está documentado em man bash
:
Redirections are processed in the order they appear, from left to right.
Uma exceção a este pedido, que também está documentada em man bash
, são pipelines. Considere:
command1 ... | command2
A saída padrão de command1
é enviada pelo pipe para a entrada padrão de command2
e essa conexão é executada
antes de qualquer redirecionamento especificado pelo primeiro comando.
Um exemplo com pipelines
Considere:
command1 >file.txt | command2
Como o redirecionamento para file.txt
ocorre após o redirecionamento para o pipeline, o stdout de command1
irá para file.txt
. command2
não receberá entrada.