Crea un archivo temporal en Linux con Bash
El comando mktemp en sistemas basados en Fedora y tempfile en sistemas basados en Debian están especialmente diseñados para aliviar esa carga al facilitar la creación, el uso y la eliminación de archivos únicos.
Al programar en el lenguaje de scripting Bash, a veces es necesario crear un archivo temporal. Por ejemplo, es posible que necesite tener un archivo intermediario que pueda enviar al disco para poder procesarlo con otro comando. Es fácil crear un archivo como temp
o cualquier archivo que termine en .tmp
. Sin embargo, es muy probable que esos nombres sean generados por algún otro proceso, por lo que podría sobrescribir accidentalmente un archivo temporal existente. Y además de eso, no deberías tener que esforzarte mentalmente para encontrar nombres que parezcan únicos. El comando mktemp
en sistemas basados en Fedora y tempfile
en sistemas basados en Debian están especialmente diseñados para aliviar esa carga al facilitar la creación, el uso y la eliminación de archivos únicos.
Crear un archivo temporal
Tanto mktemp
como tempfile
crean un archivo temporal como acción predeterminada e imprimen el nombre y la ubicación del archivo como salida:
$ tempfile
/tmp/fileR5dt6r
$ mktemp
/tmp/tmp.ojEfvMaJEp
A menos que especifique una ruta diferente, el sistema coloca archivos temporales en el directorio /tmp
. Para mktemp
, utilice la opción -p
para especificar una ruta:
$ mktemp -p ~/Demo
/home/tux/Demo/tmp.i8NuhzbEJN
Para tempfile
, utilice la opción --directory
o -d
:
$ tempfile --directory ~/Demo/
/home/sek/Demo/fileIhg9aX
Encuentra tu archivo temporal
El problema con el uso de un archivo temporal generado automáticamente es que no hay forma de saber cuál será su nombre. Es por eso que ambos comandos devuelven el nombre del archivo generado como salida. Puede utilizar un shell interactivo como Konsole, GNOME Terminal o rxvt para utilizar el nombre de archivo que se muestra en su terminal para interactuar con el archivo.
Sin embargo, si está escribiendo un script, no hay forma de intervenir leyendo el nombre del archivo y usándolo en los siguientes comandos.
Los autores de mktemp
y tempfile
pensaron en ese problema y hay una solución fácil. El terminal envía la salida a una secuencia llamada stdout. Puedes capturar la salida estándar configurando una variable para los resultados de un comando lanzado en un subshell:
$ TMPFILE=$(mktemp -p ~/Demo)
$ echo $TMPFILE
/home/tux/Demo/tmp.PjP3g6lCq1
Utilice $TMPFILE
cuando haga referencia al archivo, y es lo mismo que interactuar directamente con el archivo mismo.
Crea un directorio temporal con mktemp
También puedes usar el comando mktemp
para crear un directorio en lugar de un archivo:
$ mktemp --directory -p ~/Demo/
/home/tux/Demo/tmp.68ukbuluqI
$ file /home/tux/Demo/tmp.68ukbuluqI
/home/tux/Demo/tmp.68ukbuluqI: directory
Personalizar nombres temporales
A veces es posible que desee un elemento de previsibilidad incluso en los nombres de archivos generados de forma pseudoaleatoria. Puede personalizar los nombres de sus archivos temporales con ambos comandos.
Con mktemp
, puedes agregar un sufijo a tu nombre de archivo:
$ mktemp -p ~/Demo/ --suffix .mine
/home/tux/Demo/tmp.dufLYfwJLO.mine
Con tempfile
, puedes establecer un prefijo y un sufijo:
$ tempfile --directory ~/Demo/ \
--prefix tt_ --suffix .mine
/home/tux/Demo/tt_0dfu5q.mine
Archivo temporal como toque
También puedes establecer un nombre personalizado con tempfile
:
$ tempfile --name not_random
not_random
Cuando usas la opción --name
, es absoluta, ignorando todas las demás formas de personalización. De hecho, incluso ignora la opción --directory
:
$ tempfile --directory ~/Demo \
--prefix this_is_ --suffix .all \
--name not_random_at
not_random_at
En cierto modo, tempfile
puede ser un sustituto de touch
y test
porque se niega a crear un archivo que ya existe:
$ tempfile --name example.txt
open: file exists
El comando tempfile
no está instalado en todas las distribuciones de Linux de forma predeterminada, por lo que debe asegurarse de que exista antes de usarlo como un truco para test
en un script.
Instalar mktemp y tempfile
GNU Core Utils incluye el comando mktemp
. Las distribuciones principales incluyen Core Utils de forma predeterminada (es el mismo paquete que contiene chmod
, cut
, du
y otros comandos esenciales).
El paquete Debian Utils incluye el comando tempfile
y se instala de forma predeterminada en la mayoría de las distribuciones basadas en Debian y Slackware Linux.
Envolver
Los archivos temporales son convenientes porque no hay confusión sobre si es seguro eliminarlos. Son temporales, están destinados a usarse según sea necesario y descartarse sin pensarlo dos veces. Úsalos cuando los necesites y límpialos cuando hayas terminado.