Quiero una forma rápida y sencilla de ejecutar un comando cada vez que un archivo cambie. Quiero algo muy simple, algo que dejaré ejecutando en un terminal y lo cerraré cada vez que termine de trabajar con ese archivo.
Actualmente, estoy usando esto:
while read; do ./myfile.py ; done
Y luego tengo que ir a ese terminal y presionar Enter, cada vez que guardo ese archivo en mi editor. Lo que quiero es algo así:
while sleep_until_file_has_changed myfile.py ; do ./myfile.py ; done
O cualquier otra solución tan fácil como esa.
BTW: Estoy usando Vim, y sé que puedo añadir un autocomando para ejecutar algo en BufWrite, pero esto no es el tipo de solución que quiero ahora.
Actualización: Quiero algo sencillo, descartable si es posible. Es más, quiero algo que se ejecute en un terminal porque quiero ver la salida del programa (quiero ver los mensajes de error).
Sobre las respuestas: ¡Gracias por todas las respuestas! Todas son muy buenas, y cada una tiene un enfoque muy diferente de las demás. Como tengo que aceptar sólo una, acepto la que he utilizado realmente (era sencilla, rápida y fácil de recordar), aunque sé que no es la más elegante.
Solución usando Vim:
:au BufWritePost myfile.py :silent !./myfile.py
Pero no quiero esta solución porque es un poco molesto de escribir, es un poco difícil de recordar lo que hay que escribir, exactamente, y es un poco difícil de deshacer sus efectos (hay que ejecutar :au! BufWritePost miarchivo.py
). Además, esta solución bloquea Vim hasta que el comando haya terminado de ejecutarse.
He añadido esta solución aquí sólo para completar, ya que podría ayudar a otras personas.
Para mostrar la salida del programa (e interrumpir completamente tu flujo de edición, ya que la salida escribirá sobre tu editor durante unos segundos, hasta que pulses Enter), elimina el comando :silent
.
Un poco más en el lado de la programación, pero quieres algo como inotify. Hay implementaciones en muchos lenguajes, como jnotify y pyinotify.
Esta biblioteca permite monitorizar archivos individuales o directorios enteros, y devuelve eventos cuando se descubre una acción. La información devuelta incluye el nombre del archivo, la acción (crear, modificar, renombrar, borrar) y la ruta del archivo, entre otra información útil.