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 /dev
estã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: tryecho foo >/dev/null
. A leitura dele retorna um fluxo vazio de bytes (EOF imediato)./dev/zero
: uma fonte infinita de0x00
bytes. 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/null
funcionasse 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/null
e, portanto, descartada.
Isso é usado principalmente ao usar comandos que fornecem resultados que você não deseja ver.
A leitura de /dev/null
retorna imediatamente o fim do arquivo — ou seja, funciona como um arquivo vazio.
Há outras coisas divertidas /dev
que random
fornecem dados aleatórios; não é realmente o que você espera de um "arquivo" :) Vale a pena notar que /dev/random
sã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/urandom
fornece 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/zero
para 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 file
o comando também fornece uma -s
opção que o força a ler independentemente ...
$ file -s /dev/null
/dev/null: empty
Talvez o seu hx
comando tenha uma opção semelhante que você possa usar?
A razão pela qual file
(e talvez o seu hx
comando também) não identifique arquivos não regulares por padrão é sugerida na documentação da -s
opção emfile
pá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.
- O tamanho do conteúdo não será conhecido antecipadamente (ou precisará
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 -s
para 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/zero
ou /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 512
opçã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.