¿Por qué querrías cat / dev / null en algo?
Hará eso para truncar el contenido de un archivo mientras mantiene el inodo intacto. Todos los programas que tienen ese archivo abierto para leer o escribir no se verían afectados fuera del hecho de que el tamaño del archivo se restablecería a cero.
Una alternativa falsa que a menudo se encuentra es eliminar el archivo y luego volver a crearlo:
rm file
touch file
o similar:
mv file file.old
gzip file.old
touch file
El problema es que estos métodos no evitan que el archivo antiguo se mantenga escrito por cualquier proceso que tenga el archivo eliminado abierto en el momento de la eliminación. La razón por la cual está bajo los sistemas de archivos Unix, cuando elimina un archivo, solo desvincula su nombre (ruta) de su contenido (inodo). El inodo se mantiene vivo siempre que haya procesos que lo tengan abierto para leer o escribir.
Esto lleva a varios efectos negativos: los registros escritos después de la eliminación del archivo se pierden, ya que no hay una forma directa / portátil de abrir un archivo eliminado. Mientras un proceso escriba en el archivo eliminado, su contenido seguirá utilizando espacio en el sistema de archivos. Eso significa que si elimina / crea el archivo porque estaba llenando su disco, el disco permanece lleno. Una forma de solucionar este último problema es reiniciar los procesos del registrador, pero es posible que no desee hacerlo para los servicios críticos y los registros intermedios se perderían definitivamente. También hay efectos secundarios debido al hecho de que el archivo que cree podría no tener los mismos permisos, propietario y grupo que el original. Esto, por ejemplo, podría evitar que un analizador de registros lea el archivo recién creado o, lo que es peor, evitar que el proceso de registro escriba sus propios registros.
El primer método, cat /dev/null > file
lograr el objetivo correctamente , sin embargo, a pesar de una tenaz leyenda urbana, su cat /dev/null
parte no hace absolutamente nada útil. Abre un pseudo archivo que está vacío por diseño, no puede leer nada de él y finalmente se cierra. El uso de este comando es un desperdicio de pulsaciones de teclas, bytes, llamadas al sistema y ciclos de la CPU, y puede ser reemplazado sin ningún cambio funcional por el comando no-operablemente más rápido :
o incluso, con la mayoría de los shells, por ningún comando.
Déjame probar una metáfora para explicar lo inútil que cat /dev/null
es. Digamos que su objetivo es vaciar un vaso.
Primero eliminas cualquier líquido de él. Eso es suficiente y es precisamente lo que hace ( > file
) dado el hecho de que las redirecciones siempre se procesan primero.
Luego, elige una botella vacía ( /dev/null
) y la vierte en el vaso vacío ( cat
). Este es el paso inútil ...
Si lee su documento vinculado hasta el final, puede notar los comentarios en esta línea de la versión mejorada del script:
cat / dev / null> wtmp # ':> wtmp' y '> wtmp' tienen el mismo efecto.
Tienen de hecho; lástima cat /dev/null
se mantuvo en el código.
Eso significa que el siguiente código funcionará con todos los shells comunes (ambos csh
y sh
familias):
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
y esto va a trabajar con todas las conchas utilizando la sintaxis Bourne, como ash
, bash
, ksh
, zsh
y los gustos:
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
Sin embargo, tenga en cuenta que con los antiguos shells Bourne anteriores a POSIX, cualquiera de estos comandos, incluido el cat /dev/null
truncado, no truncará un archivo si luego lo escribe un script de shell que aún se está ejecutando. En lugar de un archivo de cero bytes, sería un archivo disperso con su tamaño sin cambios. Lo mismo sucedería si el archivo está escrito por un proceso que busca la posición que cree que es la actual antes de escribir.
Tenga en cuenta también que algunas soluciones alternativas a menudo sugeridas para truncar un archivo tienen fallas.
Los dos siguientes simplemente no hacen el trabajo. El archivo resultante no está vacío, pero contiene una línea vacía. Esto rompería los archivos de registro como wtmp
ese que almacenan registros de ancho fijo.
echo > file
echo "" > file
El siguiente basado en una sh
opción BSD no es portátil, POSIX no especifica ninguna opción permitida para echo, por lo que puede terminar con un archivo que contiene una línea con " -n
":
echo -n > file
Ese tampoco es portátil usando una sh
secuencia de escape del Sistema V. Algunos shells crearán un archivo que contiene una línea con " \c
":
echo "\c" > file
Ese usa un comando diseñado para hacer el trabajo. El problema que está utilizando truncate
no es portátil porque este comando, que no está especificado por POSIX, puede faltar en un sistema Unix / Linux.
truncate -s 0
Finalmente, aquí hay un par de alternativas que son portátiles y que harán el trabajo correctamente:
Imprimir explícitamente una cadena vacía en el archivo:
printf "" > file
Usando el true
comando que es estrictamente equivalente al no operativo, :
aunque más legible:
true > file