(ES)(Bash Scripting) Capturar señal ctrl+C y cambiar su comportamiento

Muchas veces (la mayoría) los script utilizan archivos y otras herramientas del sistema para funcionar, y es necesario limpiar esos archivos una vez acabado el script. Pero, ¿que pasa si el usuario fuerza el cierre del script antes de que acabe con un ctrl+c? pues el truco es capturar la señal de finalización y cambiar su comportamiento. De este modo se ejecutará una última función antes de acabar. Veamoslo en un ejemplo:

#!/bin/bash

#-------
#Este "util" script cuenta ovejas y las almacena en archivos separados
#-------
#Funcion que elimina los archivos generados
function limpia(){
   rm -f archivo_oveja*.txt
   echo "Saliendo..."
   exit 0
}

for x in `seq 1 100`
do
   echo "Oveja numero $x" > archivo_oveja_$x.txt
   cat archivo_oveja_$x.txt
   sleep 2
done

limpia

Como se puede ver, una vez cuenta hasta 100 y genera los 100 archivos correspondientes, el script llama a la función limpia(), que elimina los archivos generados, indica que va a salir y hace un exit 0, pero si el usuario se cansa de esperar y decide salir, todos los archivos se quedarán, y pueden interferir en una ejecución posterior. Para evitar esto incluimos un trap que “atrape” la señal enviada por el usuario y que llame a la funcion limpia() antes de tiempo:

#!/bin/bash

#Este util script cuenta ovejas y las almacena en archivos separados

function limpia(){
    rm -f archivo_oveja*.txt
    echo "Saliendo..."
    exit 0
}

# atrapa ctrl-c y llama a la funcion limpia()
trap limpia INT

for x in `seq 1 100`
do
    echo "Oveja numero $x" > archivo_oveja_$x.txt
    cat archivo_oveja_$x.txt
    sleep 2
done

limpia

Ejecutad ambos y veis la diferencia. Hasta la próxima :D

Article automatically imported from my old wordpress blog. Here only for reference. Possible format errors and probable missing images. Sorry about that.

  • Previous post
  • Next post