Estuve buscando en /dev y encontré varios archivos, incluido null
. Quería ver qué había en el archivo, así que lo hice hx null
, pero no pasó nada y me dio el error File null is not a regular file
. ¿Qué está causando este mensaje?
Respuesta1
Varios objetos en /dev
sonpseudo-dispositivosy son manejados directamente por funciones del kernel. Los más utilizados son:
/dev/null
: el fregadero universal de capacidad infinita. Se utiliza para descartar la salida: intenteecho foo >/dev/null
. Leerlo devuelve un flujo de bytes vacío (EOF inmediato)./dev/zero
: una fuente infinita de0x00
bytes. A menudo se utiliza como entrada para sobrescribir cosas con 0./dev/random
,/dev/urandom
: infinitas fuentes de bytes aleatorios.
Respuesta2
De hecho, ninguna de las otras respuestas parece responder realmente a la pregunta de por qué hx se niega a trabajar con /dev/null. La razón por la que hx reacciona de esta manera es simplemente porque fue programado para generar este mensaje de error para los archivos del dispositivo.
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);
Eso significa que hx se niega específicamente a trabajar en cualquier cosa que no sea un archivo normal. No creo que haya una muy buena razón para esta verificación; sin ella, esperaría que /dev/null
funcionara con hx, en el sentido de que hx leería un archivo vacío y cualquier actualización se perdería al guardarla.
(Esto supone quehttps://github.com/krpors/hx/es realmente el programa hx del que habla el cartel)
Respuesta3
/dev/null
Es básicamente una forma de descartar información.
El objetivo principal es simplemente poder redirigir las cosas al olvido.
echo 'duck' > /dev/null
suprimirá el mensaje dado por echo 'duck'
cuando se envía /dev/null
y, por lo tanto, se descarta.
Esto se usa principalmente cuando se usan comandos que le brindan resultados que no desea ver.
La lectura desde /dev/null
devuelve inmediatamente el final del archivo, es decir, actúa como un archivo vacío.
Hay otras cosas divertidas /dev
que random
te darán datos aleatorios; no es realmente lo que se espera de un "archivo" :) Vale la pena señalar que /dev/random
se trata de datos aleatorios verdaderos recopilados del uso en el sistema (tiempo entre pulsaciones de teclas y cosas así), y ese grupo puede agotarse bastante rápido. /dev/urandom
le da lo que parece ser un número aleatorio pero se calcula mediante una fórmula matemática. Por lo general, /dev/urandom
está bien para sus necesidades, pero, por ejemplo, las claves criptográficas muy fuertes no son lo suficientemente buenas.
También puede leer desde /dev/zero
para obtener un flujo interminable de bytes cero (nulos).
Respuesta4
/dev/null
es un archivo de dispositivo de caracteres, es decir, una interfaz para un controlador de dispositivo.
Este dispositivo específico es un dispositivo ficticio (que no representa un hardware real). Está hecho especialmente para ser un bote de basura sin fondo; que puede volcar la salida de cualquier programa en él, en caso de que no desee que se muestren en pantalla o en cualquier otro lugar.
- En cuanto al contenido, si realmente intentarasleerEste archivo (sí túpoderléelo),va asiempreser equivalente a un archivo vacío de 0 bytes de longitud.
No sé cuál hx
es su comando, pero supongo por su descripción que era un comando para identificar el tipo de archivo.por su contenido. El comando que uso en mi sistema GNU/Linux para esta tarea es file
, y también se detiene si descubre que el archivo no es un archivo normal...
$ file /dev/null
/dev/null: character special
Pero file
el comando también proporciona una -s
opción que lo obliga a leer independientemente...
$ file -s /dev/null
/dev/null: empty
¿Quizás tu hx
comando tenga una opción similar que puedas usar?
La razón por la que file
(y tal vez su hx
comando también) no identifica archivos no regulares de forma predeterminada se insinúa en la documentación de -s
la opción enfile
página del manual, es decir...
- La lectura de estos archivos puede provocar efectos secundarios, efectos secundarios que a veces son indeseables.
- La lectura desde la tubería FIFO consume datos permanentemente, no puede volver a insertar los datos que ha leído en la tubería.
- La lectura del archivo del dispositivo hace que el dispositivo cambie...
- La lectura desde el dispositivo de cinta hace que la posición del cabezal de la cinta cambie.
- La lectura desde un dispositivo de puerto serie provoca que se consuman bytes de entrada almacenados en el búfer.
- La lectura desde un dispositivo de números aleatorios hace que se agote el conjunto de entropía del sistema.
- Y muchos más, dependiendo del controlador del dispositivo en cuestión.
- Identificar estos archivos especialespor contenidoRequiere mucho más trabajo, con mucha menos certeza:
- El tamaño del contenido no se conocerá de antemano (o necesitará
ioctl()
llamadas especiales específicas del sistema para obtenerlo). - La búsqueda no funcionará en muchos casos.
- La detección de tipos de archivos que se basan en la firma al final del archivo requerirá leerlo todo.
- Algunos de estos archivos daninfinitocontenido.
- El tamaño del contenido no se conocerá de antemano (o necesitará
En caso de que su programa no esté diseñado para manejar los trabajos necesarios, es posible que no sea capaz de identificar el contenido de archivos no regulares; y abortado como medida de seguridad.
- Si el programa se lleva a cabo sin esta verificación de seguridad, puede resultar en unacolgar, achocar, o peor aún, hacer que el sistemaquedarse sin memoria; dependiendo del diseño del programa en cuestión.
Si este es el caso, es una limitación de tu programa; utilizar file -s
en su lugar con fines de identificación.
Apéndice
si tu hx
esalguna clase dehexadecimal/binarioeditor;entonces es especialmenteNo recomendableusarlo para abrir archivos especiales que no conoces. Maleficioeditoresgeneralmente precargaarchivo completoen la memoria para sus operaciones de edición.
Por esta razón, si intenta que abra un archivo de dispositivo de contenido infinito (como /dev/zero
o /dev/urandom
) o incluso un dispositivo finito grande (como /dev/sda
), su sistema podría entrar en un estado de alerta.condición de falta de memoria, que es posible que deba restablecer toda la máquina para recuperarla.
Es probable que el control de seguridad que acaba de activar esté ahí para mantenerlo a salvo de ese escenario. (Como ya se mencionó: el tamaño del contenido del archivo del dispositivo no se conoce de antemano; el programa no puede determinar de antemano si tiene suficiente memoria para cargarlo o no)
En caso de que sólo quiera "echar un vistazo" al encabezado del archivo sin importar nada;usar hexadecimalespectadoren cambio, comohexdump
(recomendado), o de la vieja escuelaod
. Por ejemplo:
hexdump -C -n 512 /dev/null
(El contenido estará vacío)hexdump -C -n 512 /dev/urandom
(El contenido será un galimatías diferente cada vez)
^ La -n 512
opción limita la vista a los primeros 512 bytes. Pero incluso cuando omitiste esto y te bombardearon con resultados interminables, todo lo que tendrías que hacer para detenerlo es simplemente presionar Ctrl+C.