(Quase) tudo é um arquivo, mas nem tudo é um arquivo regular . Não faz sentido chamar um editor de texto em algo que seja um arquivo especial, como diretório, soquete de rede, porta serial etc.
O arquivo /dev/stdout
pode ser uma das várias coisas, dependendo da variante unix:
- um arquivo "especial", normalmente um dispositivo de caractere;
- um link simbólico “mágico” que aponta para o arquivo que o processo que o acessou abriu neste descritor;
- um link simbólico para um dos itens acima.
De qualquer forma, a abertura de /dev/stdout
arquivos e similares cria um novo descritor de arquivo associado ao mesmo arquivo que o aplicativo já abriu no descritor de arquivo 1. “Saída padrão” significa o descritor de arquivo 1, e é apenas uma convenção que esse descritor de arquivo seja usado para saída - o kernel não se importa.
Quando você executa um programa em um terminal, todos os três descritores padrão (0 = entrada padrão, 1 = saída padrão, 2 = erro padrão) são abertos no dispositivo do terminal. A leitura desse dispositivo retorna caracteres digitados pelo usuário e a gravação nesse dispositivo exibe texto na janela do terminal. (Não existe uma maneira padrão, dado um dispositivo terminal, de ler a saída que ele exibe ou injetar entrada nele.)
Quando você executa cat /dev/stdout
, faz exatamente a mesma coisa que cat /dev/stdin
ou cat /dev/stderr
, porque esses três descritores de arquivos estão conectados ao mesmo arquivo: ele diz cat
para ler no terminal. Isso é o que cat
sem argumentos também.
Se você executou cat /dev/stdout >foo
, /dev/stdout
consulte o arquivo foo
- esse comando é equivalente cat foo >foo
. Dependendo da cat
implementação, pode ocorrer um erro (a versão GNU reclama que “arquivo de entrada é arquivo de saída”) ou pode não fazer nada porque lê o arquivo foo
que está vazio ( >foo
apenas o truncou). Com uma versão cat
que não detecta esse caso especial, se foo
não estiver vazio, cat /dev/stdout >>foo
o equivalente cat foo >>foo
ao arquivo anexa o conteúdo do arquivo indefinidamente.
Quando você executa vim /dev/stdout
, ele reclama porque não sabe editar um terminal (isso simplesmente não faz sentido).