O que é /dev/null e por que não posso usar hx nele?

O que é /dev/null e por que não posso usar hx nele?

Estive procurando em/dev e me deparei com vários arquivos, incluindo null. Queria ver o que tinha no arquivo, então fiz hx null, mas não aconteceu nada e deu o erro File null is not a regular file. O que está causando esta mensagem?

Responder1

Vários objetos /devestãopseudo-dispositivose são manipulados diretamente pelas funções do kernel. Os mais usados ​​são:

  • /dev/null: o sumidouro universal de capacidade infinita. Usado para descartar a saída: try echo foo >/dev/null. A leitura dele retorna um fluxo vazio de bytes (EOF imediato).
  • /dev/zero: uma fonte infinita de 0x00bytes. Freqüentemente usado como entrada para substituir coisas com 0s.
  • /dev/random, /dev/urandom: fontes infinitas de bytes aleatórios.

Responder2

Na verdade, nenhuma das outras respostas parece realmente responder à questão de por que hx se recusa a trabalhar com/dev/null. A razão pela qual o hx reage dessa maneira é simplesmente porque ele foi programado para gerar essa mensagem de erro para arquivos de dispositivos.

Dehttps://github.com/krpors/hx/blob/develop/editor.c#L125:

if (!S_ISREG(statbuf.st_mode)) {
        fprintf(stderr, "File '%s' is not a regular file\n", filename);
        exit(1);

Isso significa que o hx se recusa especificamente a trabalhar em qualquer coisa que não seja um arquivo normal. Não acho que haja uma razão muito boa para essa verificação - sem ela, eu esperaria que /dev/nullfuncionasse com hx, no sentido de que hx leria um arquivo vazio e quaisquer atualizações seriam perdidas ao salvá-las.

(Isso pressupõe quehttps://github.com/krpors/hx/é realmente o programa hx sobre o qual o autor da postagem fala)

Responder3

/dev/nullé basicamente uma forma de descartar informações.

O objetivo principal é simplesmente poder redirecionar as coisas para o esquecimento.

echo 'duck' > /dev/null

suprimirá a mensagem fornecida por echo 'duck'quando ela for enviada /dev/nulle, portanto, descartada.

Isso é usado principalmente ao usar comandos que fornecem resultados que você não deseja ver.

A leitura de /dev/nullretorna imediatamente o fim do arquivo — ou seja, funciona como um arquivo vazio.

Há outras coisas divertidas /devque randomfornecem dados aleatórios; não é realmente o que você espera de um "arquivo" :) Vale a pena notar que /dev/randomsão verdadeiros dados aleatórios coletados do uso no sistema (tempo entre as teclas digitadas e coisas assim), e esse pool pode se esgotar rapidamente. /dev/urandomfornece o que parece ser um número aleatório, mas é calculado por uma fórmula matemática. Geralmente /dev/urandomé adequado para a sua necessidade, mas, por exemplo, chaves criptográficas muito fortes não são boas o suficiente.

Você também pode ler /dev/zeropara obter um fluxo infinito de zero bytes (nulos).

Responder4

/dev/nullé um arquivo de dispositivo de caracteres, ou seja, uma interface para um driver de dispositivo.

Este dispositivo específico é um dispositivo fictício (não representa um hardware real). É feito especialmente para ser uma lata de lixo sem fundo; que você pode despejar a saída de qualquer programa nele, caso não queira que eles sejam exibidos ou em qualquer outro lugar.

  • Em termos de conteúdo, se você realmente tentoulereste ficheiro (sim vocêpodeLeia-o),ele vaisempreser equivalente a um arquivo vazio de comprimento de 0 bytes.

Não sei qual hxé o seu comando, mas acho que pela sua descrição é um comando para identificar o tipo de arquivopelo seu conteúdo. O comando que uso no meu sistema GNU/Linux para esta tarefa é file, e ele também para, se descobrir que o arquivo não é um arquivo normal...

$ file /dev/null
/dev/null: character special

Mas fileo comando também fornece uma -sopção que o força a ler independentemente ...

$ file -s /dev/null
/dev/null: empty

Talvez o seu hxcomando tenha uma opção semelhante que você possa usar?

A razão pela qual file(e talvez o seu hxcomando também) não identifique arquivos não regulares por padrão é sugerida na documentação da -sopção emfilepágina de manual, ou seja...

  • A leitura desses arquivos pode causar efeitos colaterais, efeitos colaterais que às vezes são indesejáveis.
    • A leitura do tubo FIFO consome dados permanentemente, você não pode enviar os dados lidos de volta para o tubo.
    • A leitura do arquivo do dispositivo faz com que o dispositivo mude...
      • A leitura do dispositivo de fita faz com que a posição do cabeçote da fita mude.
      • A leitura do dispositivo de porta serial faz com que os bytes de entrada armazenados em buffer sejam consumidos.
      • A leitura do dispositivo de número aleatório faz com que o conjunto de entropia do sistema se esgote.
      • E muito mais, dependendo do driver do dispositivo em questão.
  • Identificando esses arquivos especiaispor conteúdorequer muito mais trabalho, com muito menos certeza:
    • O tamanho do conteúdo não será conhecido antecipadamente (ou precisará ioctl()de chamadas especiais específicas do sistema para ser obtido).
    • Buscar não funcionará em muitos casos.
    • A detecção de tipos de arquivo que dependem da assinatura de final de arquivo exigirá a leitura de tudo.
    • Alguns desses arquivos forneceminfinitocontente.

Caso o seu programa não seja projetado para realizar os trabalhos necessários, talvez ele não seja capaz de identificar o conteúdo de arquivos não regulares; e abortado como medida de segurança.

  • Se o programa prosseguir sem esta verificação de segurança, poderá resultar empendurar, acolidir, ou pior, fazer com que o sistemaficar sem memória; dependendo do design do programa em questão.

Se for esse o caso, é uma limitação do seu programa; use file -spara fins de identificação.


Termo aditivo

Se o seu hxéum tipo dehexadecimal/binárioeditor;então é especialmenteNão aconselhávelusá-lo para abrir arquivos especiais que você não conhece. Feitiçoeditoresgeralmente pré-carregaarquivo inteirona memória para suas operações de edição.

Por esse motivo, se você tentar abrir um arquivo de dispositivo de conteúdo infinito (como /dev/zeroou /dev/urandom) ou mesmo um dispositivo grande e finito (como /dev/sda), isso poderá levar seu sistema a um estado de alerta.condição de falta de memória, que pode ser necessário redefinir toda a máquina para recuperar.

A verificação de segurança que você acabou de fazer provavelmente existe para mantê-lo protegido desse cenário. (Como já mencionado: o tamanho do conteúdo do arquivo do dispositivo não é conhecido antecipadamente – o programa não pode determinar antecipadamente se você tem memória suficiente para carregá-lo ou não)

Caso você queira apenas "espiar" o cabeçalho do arquivo, não importa o que aconteça;usar hexadecimalvisualizadorem vez de, comohexdump(recomendado) ou old-schoolod. Por exemplo:

  • hexdump -C -n 512 /dev/null(O conteúdo estará vazio)
  • hexdump -C -n 512 /dev/urandom(O conteúdo será um jargão diferente a cada vez)

^ A -n 512opção limita a visualização aos primeiros 512 bytes. Mas mesmo quando você omitiu isso e foi bombardeado com resultados infinitos, tudo o que você precisa fazer para pará-lo é apenas pressionar Ctrl+C.

informação relacionada