Si lo hago: touch file; mv file /dev/null
como root,/dev/null
desaparece. ls -lad /dev/null
no da como resultado tal archivo o directorio. Esto interrumpe las aplicaciones que dependen de /dev/null
SSH y se pueden resolver haciendo esto mknod /dev/null c 1 3; chmod 666 /dev/null
. ¿Por qué mover un archivo normal a este archivo especial resulta en la desaparición de /dev/null
?
Para aclarar, esto fue con fines de prueba, y entiendo cómo funciona el mv
comando. Lo que tengo curiosidad es por qué ls -la /dev/null
antes de reemplazarlo con un archivo normal muestra el resultado esperado, pero luego muestra que /dev/null
no existe a pesar de que supuestamente se creó un archivo a través del mv
comando original y el comando de archivo muestra texto ASCII. Creo que esto debe ser una combinación del ls
comportamiento del comando junto con devfs
cuando un archivo no especial reemplaza un archivo de caracteres / especial. Esto está en Mac OS X, los comportamientos pueden variar en otros sistemas operativos.
/dev/null
.rm
comando.devfs
es divertido con los archivos normales. Sin embargo, es extraño que no haya recibido un errormv
. ¿Qué tal esta maneratouch testfile; mv testfile /dev
:?mv
solo puede ser atómico en el mismo sistema de archivos.Respuestas:
Mirando el código fuente de mv, http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
En la primera pasada a través del ciclo while,
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
fallará con EEXIST. Luego/dev/null
se desvinculará y se repetirá el ciclo. Pero como señaló en su comentario, no se pueden crear archivos regulares en/dev
, por lo que en el próximo paso a través del ciclo,open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
todavía va a fallar.Presentaría un informe de error con Apple. El
mv
código fuente en su mayoría no ha cambiado desde la versión de FreeBSD, pero debido a que los devfs de OSX tienen ese comportamiento que no es POSIX con los archivos normales, Apple debería corregirlosmv
.fuente
Mover un archivo a la ubicación de un archivo ya existente reemplaza el archivo existente. En este caso, el
/dev/null
archivo del dispositivo se reemplaza, como lo haría cualquier archivo normal. Para evitar esto, use la opción-i
(interactivo, advierte antes de sobrescribir) o-n
(sin clober) paramv
./dev/null
solo realiza su función especial como un depósito de bits y luego el dispositivo se abre como está. Por ejemplo, cuando>
se utiliza el operador de shell, el archivo se abre y luego se trunca (no se elimina y se reemplaza, lo que puede ser lo que esperaba). Como mencionó Casey, la forma correcta de eliminar un archivo es conrm
o incluso conunlink
.fuente
Umm, ¿porque sobrescribes el archivo especial con uno normal? Qué esperabas que sucediera?
dev/null
no es un directorio, es un archivo que apunta a unnull
dispositivo. Cuando tienemv
algo que hacer, elimina el original y lo reemplaza con lo que haya movido:fuente
/dev/null
, se ha convertido en el archivo que moví.