La idea de querer ejecutar un script al modificar un fichero surgió a raiz del artículo donde expliqué cómo editar y crear archivos cifrados con GPG en Vim. Aunque parezca un poco dificil encontrarle utilidad a esta idea, puede resultar bastante cómodo por ejemplo compilar automáticamente un programa cada vez que modificamos el código, borrar ficheros generados automáticamente etc, hay multidud de aplicaciones posibles en función de nuestras necesidades.



A mi personalmente me hacía falta para cifrar un archivo automáticamente tras modificarlo, pero más tarde caí en la cuenta de que eso ya lo hace el plugin de Vim.

Antes de poder usar el script es necesario instalar inotify-tools

# aptitude install inotify-tools

Hecho esto, ahora es posible ejecutar el script que he creado:

function help {
   echo "$0 <directory> <file to="to" watch="watch"> <script to="to" execute="execute">"
}

if [ "$#" -ne 3 ]; then
   help
   exit 1
fi

while true; do
  change=$(inotifywait -e close_write $1)
  echo $change
  change=${change#./ * }
  if [ "$change" = "$2" ]; then ./$3; fi
done

El script recibe 3 parámetros; El directorio donde se encuentra el fichero, el nombre del fichero y el script a ejecutar al detectar cambios. Veamos un ejemplo trivial que simplemente escribirá un texto al final del fichero:

$ cat ejemplo
elbauldelprogramador.com
$ cat script.sh
#!/bin/bash

echo "Script ejecutado tras editar" >> ejemplo
$ ./notifyChangesOnFile.sh . ejemplo script.sh
Setting up watches.
Watches established.
./ CLOSE_WRITE,CLOSE ejemplo
Setting up watches.
Watches established.

Tras ejecutar notifyChangesOnFile.sh abrimos el fichero de ejemplo con cualquier editor y cuando guardemos aparece en pantalla ./ CLOSE_WRITE,CLOSE ejemplo indicando que se ha modificado. Si volvemos a mirar el fichero de ejemplo su contenido es:

$ cat ejemplo
elbauldelprogramador.com




escribimos algo para modificar el fichero y guardamos
Script ejecutado tras editar

Espero que sea de utilidad, el repositorio de inotify-tools está en github (Enlace en las referencias).

Referencias