/dev/null
é um arquivo especial de caractere, o que significa que é um arquivo sem conteúdo que está marcado como sendo capaz de originar e afundar fluxos de bytes nele. O que acontece com esses fluxos é determinado pelos números dos dispositivos. No meu sistema BSD no momento:
crw-rw-rw- 1 root wheel 3, 2 Jan 25 14:57 /dev/null
os números dos dispositivos são 3,2 (o número principal é 3, o número menor é 2). Eu posso criar outros arquivos /dev/null
como usando mknod /dev/nil c 3 2
, onde o c significa que eu quero um arquivo especial de caractere, mas em sistemas BSD, o par de números de dispositivos é dinamicamente criado e pode não ser o mesmo próximo.
Para ver como esses fatos se aplicam na prática:
sh-2.05b# mknod /dev/nil c 3 2
sh-2.05b# ls -l /dev/nil
crw-r--r-- 1 root wheel 3, 2 Jan 25 15:14 /dev/nil
sh-2.05b# echo abc > /dev/nil
sh-2.05b# cat < /dev/nil
sh-2.05b#
O Linux usa o par maior-menor 1,3, então mknod /dev/null c 1 3
irá recriar seu arquivo lá.
Os arquivos especiais de caracteres são como a maioria dos outros arquivos em muitos aspectos e podem ser excluídos se você tiver as permissões. Usar mv
em um arquivo de dispositivo é exatamente o mesmo que se você movesse um arquivo regular, o que significa que você obtém um arquivo completamente novo, o que pode ser observado observando os inodes. Por exemplo (Mac OS desta vez, mas todos os * nixes se comportarão da mesma forma aqui):
helen:tmp cas$ touch abc def
helen:tmp cas$ ls -i1
3775141 abc
3775142 def
helen:tmp cas$ mv abc def
helen:tmp cas$ ls -i1
3775141 def
helen:tmp cas$ echo clobber > def
helen:tmp cas$ ls -i1
3775141 def
Veja como o inode associado ao nome do arquivo def
mudou depois que usei mv
, com o arquivo antigo simplesmente sendo excluído, mas quando gravei a saída de echo
no arquivo chamado def
, o inode continuou o mesmo. Portanto, seu mv
falhará, provavelmente se você não for root, ou excluirá o arquivo e colocará um novo arquivo no caminho /dev/null
, o que não é o especial para esse caractere.