Você está parcialmente certo em suas expectativas. "Tudo é um arquivo" significa que mesmo coisas que não são arquivos, como telas, microfones, etc, ocupam um lugar na árvore do sistema de arquivos e podem ser acessadas usando alguns das mesmas chamadas de sistema como arquivos regulares ( open, write,
etc.). Muitos de seus exemplos não são muito parecidos com arquivos. /dev/null
não é um arquivo vazio, por exemplo, mas um "driver de dispositivo" muito especial, um pequeno código do kernel que aceita solicitações de leitura e gravação (retornando EOF
para o primeiro e ignorando o segundo). Portanto, não é realmente um arquivo, mas se comporta como um. Pense também no ponto de montagem de um disco: ele não é um arquivo em nenhum sentido, é um gancho que dá acesso a toda a hierarquia de arquivos nesse disco.
Um diretório, por outro lado, é de fato um "bloco de bytes" como colocado por @goldilocks: Ele ocupa espaço no disco e contém a estrutura de dados que mapeia os nomes dos arquivos. para inodes. Mas, como você descobriu, ele não se comporta como arquivos simples. Você está recebendo mensagens de erro porque os diretórios são muito importantes para deixar vulneráveis a comandos comuns do usuário. Imagine se você acidentalmente escreveu
grep foo bar > subdir
onde você pretendia escrever
grep foo bar > subdir/newfile
... seu diretório subdir
seria escolhido, e com ele a consistência do seu sistema de arquivos, porque todos os seus arquivos subitamente se tornariam órfãos inodes. Portanto, os diretórios são protegidos de várias maneiras. Você também não tem permissão para fazer um link físico para um diretório, porque vários links para diretórios significam que o sistema de arquivos não é mais uma árvore. Nos velhos tempos (décadas atrás), a raíz costumava ser capaz de fazer um pouco disso, e havia todo tipo de "editores de diretórios" por aí. Não tenho certeza até que ponto isso ainda é possível.