jueves, 27 de diciembre de 2018

Trabajo con ficheros temporales en bash

En esta entrada vamos a ver una buena forma de gestionar los archivos temporales que se crean en los scripts bash.
Inicialmente, un script que requiera la creación de ficheros temporales podría tener la siguiente forma:
#!/usr/bin/env bash

TMPFILE=/tmp/temporal
df -h > $TMPFILE
free -m >> $TMPFILE
LINEAS=$(wc -l $TMPFILE | cut -d " " -f 1)
echo "$LINEAS lineas"
rm -f $TMPFILE

Como se observa, se establece un nombre para nuestro fichero temporal, donde guardaremos algunos resultados y contaremos finalmente el número de lineas de este fichero temporal. Para no dejar residuos, se eliminará el temporal.
Esta solución tiene la pega de usar un nombre estático para el temporal. Si ya existiera un fichero con este mismo nombre, nuestro script lo sobreescribiría.
Veamos una mejora a esta primera aproximación:
#!/usr/bin/env bash

TMPFILE=$RANDOM$RANDOM
df -h > $TMPFILE
free -m >> $TMPFILE
LINEAS=$(wc -l $TMPFILE | cut -d " " -f 1)
echo "$LINEAS lineas"
rm -f $TMPFILE
Ahora, en puesto de usar un nombre predefinido para el temporal, se usará una cadena random generada en el mismo momento de la ejecución del script. Se ha usado doblemente la variable $RANDOM para aumentar el tamaño de la cadena aleatoria.
No obstante, vamos a ver una forma más elegante de gestionar estos ficheros temporales:
#!/usr/bin/env bash

TMPFILE=$(mktemp)
df -h > $TMPFILE
free -m >> $TMPFILE
LINEAS=$(wc -l $TMPFILE | cut -d " " -f 1)
echo "$LINEAS lineas"
rm -f $TMPFILE
El comando mktemp crea un fichero temporal con nombre aleatorio en /tmp/ y devuelve como resultado el nombre de dicho fichero. Por tanto, la linea
TMPFILE=$(mktemp)
genera este fichero y asigna a la variable $TMPFILE el nombre del fichero creado. De esta forma, se delega la creación de ficheros temporales con nombres aleatorios en un directorio apropiado como puede ser /tmp.
El comando mktemp tiene varias opciones que se recomienda revisar. Una interesante es la de cambiar el directorio y el nombre de comienzo del fichero temporal para personalizarlo. Por ejemplo, si se desea que el nombre comience por myapp, que tenga 3 caracteres aleatorios y que se cree en el directorio actual, bastará con ejecutarlo de la siguiente forma:
TMPFILE=$(mktemp myapp.XXX)