Por que posso mover coisas para / dev / null apesar de ser um pseudo-dispositivo representado por um arquivo?

7

Eu sempre pensei em /dev/null como um buraco negro, da mesma forma que todos os dados que eu envio não serão ecoados de volta. No entanto, há um problema com essa definição. Segundo a Wikipedia:

/dev/null is a special file, not a directory, so one cannot move files into it with the Unix mv command.

Seguindo essa definição, por que eu posso mv ? Por exemplo, posso fazer facilmente:

# touch oi
# mv oi /dev/null

O que está acontecendo lá?

    
por Marcos Roriz Junior 25.01.2010 / 13:21

7 respostas

8

Se você tentar mover qualquer coisa para / dev / null em um usuário simples (não root), receberá um erro Permission denied porque mv something /dev/null está realmente tentando excluir /dev/null e, em seguida, mover something para o que /dev/null foi.

Se você tentar fazer isso na raiz, irá excluir /dev/null (e então mover o arquivo fornecido por você em seu lugar)! Você pode restaurá-lo reiniciando ou digitando o seguinte em um shell de root (no Linux): mknod /dev/null c 1 3; chmod a+w /dev/null ou em BSD: mknod /dev/null c 3 2; chmod a+w /dev/null .

    
por 25.01.2010 / 13:48
5

Quando você faz isso:

# mv oi /dev/null

Você está realmente fazendo o equivalente ao seguinte

# rm /dev/null
# mv oi /dev/null
    
por 25.01.2010 / 13:40
3

Você não pode

# uname -sr
Linux 2.6.32-ARCH
# touch a
# mv a /dev/null
mv: inter-device move failed: 'a' to '/dev/null'; unable to remove target: Permission denied
    
por 25.01.2010 / 13:31
2

/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.

    
por 25.01.2010 / 15:15
0

Por que mv um arquivo para /dev/null (mesmo que seja possível) quando você pode simplesmente excluí-lo?

Certamente, /dev/null é mais útil e é destinado como um destino para dados de saída?

    
por 25.01.2010 / 13:25
0

Shell Scripting é um uso comum:

cat somefile >/dev/null 2>&1

Às vezes você não quer ver / mostrar erros, etc.

    
por 25.01.2010 / 13:43
-1

/ dev / null é como um buraco negro e / ou um arquivo vazio. formidável! Você pode colocar qualquer coisa aqui e não conseguir nada de lá.

    
por 25.01.2010 / 13:28

Tags