É importante saber que seu shell não está redirecionando a saída , mas os descritores de arquivos . Todo processo em um sistema operacional compatível com POSIX possui 3 fluxos de E / S: STDIN, STDOUT e STDERR. O redirecionamento >
redireciona o descritor de arquivo para o fluxo STDOUT. Então, o que a shell vê enquanto analisa essa linha é:
-
cat test.txt
- Ok, eu vou rodar o programacat
e dar o argumentotest.txt
-
> dummy.txt
- Ah, agora vou pegar o descritor STDOUT do processocat
e conectá-lo a este arquivo chamado "dummy.txt". Eu não me importo se alguma coisa estava lá antes, eu vou criar o arquivo e truncá-lo para zero. -
> dummy2.txt
- Ah, agora eu vou pegar o descritor STDOUT do processocat
(que eu conectei anteriormente a "dummy.txt") e conectá-lo a um novo arquivo diferente. Eu não posso fazer as duas coisas, porque você está redirecionando, e não dup inserindo os descritores de arquivos.
É por isso que este comando:
find / 2>&1 >/dev/null
resulta em saída de erro no STDOUT e nenhuma saída regular (STDOUT), mas esta aqui:
find / >/dev/null 2>&1
resulta em nenhuma saída. No primeiro caso, colocamos STDERR em uma cópia (dup) de STDOUT, depois colocamos o STDOUT antigo no lixo. Na segunda, primeiro colocamos o STDOUT na lixeira, depois copiamos (ainda apontamos para /dev/null
) e colocamos o STDERR lá também.