É apenas uma convenção usar fd 0/1/2 para entrada / saída / erro. Se você chamar um programa sem redirecionamento, todos os três se referem ao seu tty, e seu tty é aberto com acesso de leitura e gravação. Isso significa que você pode ler ou escrever para eles como quiser. Você poderia chamá-los de mesmo fluxo, embora o fluxo de expressão seja frequentemente usado para E / S de nível superior, como FILE
em C ou stream
em C ++.
Essa é a razão pela qual os exemplos redirecionados ou não apenas refletem o texto digitado.
Por outro lado, se você redirecionar, o shell abrirá os arquivos com acesso somente leitura ou somente gravação. No seu exemplo ./a.out 2>/dev/null
, a gravação para 0
ainda está conectada ao terminal porque não é redirecionada e, portanto, é exibida na tela. A leitura de 2
está conectada a uma gravação apenas /dev/null
e deve falhar, mas você não notará a diferença do seu programa. A gravação para 2
é bem-sucedida, mas é gravada em /dev/null
. A leitura inválida e a gravação válida em /dev/null
não estão visíveis no seu terminal.