martes, 5 de mayo de 2009

Usar la sentencia trap para limpiar archivos temporales

La sentencia trap en bash hace que tu script (código) ejecute uno o mas comandos cuando la señal es recibida. Una de las cosas mas útiles que puedes hacer con esto es limpiar archivos temporalmente cuando tu script existe.

Para ejecutar código cuando tu script recibe la señal, usa la siguiente sintaxis:

trap arg sigspec...

"arg" es el comando que quieres ejecutar. Si el comando contiene espacios, encierralo en comillas (' '). Puedes incluir múltiples comandos seprandolos con punto y coma (;). Para cosas mas complejas, pon tu código de salida en una función y solo invoca la función. El "sigspec" muestra una lista de señales para trap y entonces ejecuta "arg". Por ejemplo para remover un archivo al salir, has lo siguiente:

trap "rm -f afile" EXIT

Ten en cuenta que EXIT no es una señal real (ejecuta kill -l para ver todas las señales); esta sintetizada por bash.

Ten cuidado cuando usas comodines en "arg" ya que si no están encerrados en comillas o encerrados con comillas dobles, pueden expandirse cuando la sentencia trap es encontrada y no cuando "arg" es ejecutado. Por ejemplo, si tienes un archivo llamado "abc.tmp" y la siguiente sentencia trap es ejecutada:

trap "rm -f *.tmp" EXIT

el comando que se ejecuta cuando el código sale es "rm -f abc.tmp" y no "rm -f *.tmp". Para evitar este problema usa comillas simples.

Si creas archivos temporales en varios lugares de tu código y no usas estilo para nombrarlos esto podría permitirte usar un comodín en tu sentencia trap y no preocuparte por cambiar tu sentencia trap en cada parte del código, podrías escribir algo como esto que te permite añadir un nuevo comando trap que se ejecute al salir:

#!/bin/bash

declare -a on_exit_items

function al_salir()
{
for i in "${on_exit_items[@]}"
do
echo "al_salir: $i"
eval $i
done
}

function agregar_al_salir()
{
local n=${#on_exit_items[*]}
on_exit_items[$n]="$*"
if [[ $n -eq 0 ]]; then
echo "Configurando trap"
trap al_salir EXIT
fi
}

touch $$-1.tmp
agregar_al_salir rm -f $$-1.tmp

touch $$-2.tmp
agregar_al_salir rm -f $$-2.tmp

ls -la

Aquí la función agregar_al_salir() añade comandos a un arreglo (array) y la función al_salir() hace un bucle a través de los comandos en el arreglo y los ejecutas al salir. La función al_salir se configura la primera vez que agregar_al_salir es llamado.

Fuente.

No hay comentarios: