Escribí un programa Python para hacer exactamente esto, llamado rerun
.
ACTUALIZACIÓN: Esta respuesta es un script Python que sondea los cambios, lo cual es útil en algunas circunstancias. Para un script Bash sólo para Linux que usa inotify, vea mi otra respuesta, busque en esta página ‘rerun2’.
Instalar para Python2 o Python3 con:
pip install --user rerun
y el uso es muy simple:
rerun "COMMAND"
El comando se espera como un solo arg, no una secuencia de args separados por el espacio. Por lo tanto, cítelo como se muestra, lo que reduce cualquier escape extra que tenga que añadir. Simplemente escribe el comando como lo habrías escrito en la línea de comandos, pero rodeado de comillas.
De forma predeterminada observa todos los archivos en o bajo el directorio actual, omitiendo cosas como los dirs de control de fuente conocidos, .git, .svn, etc.
Las banderas opcionales incluyen ‘-i NAME’ que ignora los cambios en los archivos o directorios nombrados. Esto se puede dar varias veces.
Como es un script en Python, necesita ejecutar el comando como un subproceso, y usamos una nueva instancia del shell actual del usuario para interpretar ‘COMMAND’ y decidir qué proceso ejecutar realmente. Sin embargo, si su comando contiene alias de shell y similares que están definidos en .bashrc, estos no serán cargados por el sub-proceso. Para arreglar esto, puedes darle a la reejecución una bandera ‘-I’, para usar sub-shells interactivos (alias ‘login’). Esto es más lento y más propenso a errores que iniciar un shell regular, porque tiene que originar tu .bashrc.
Yo lo uso con Python 3, pero la última vez que revisé la reejecución aún funcionaba con Python 2.
Espada de doble filo es que usa polling en vez de inotify. Por el lado positivo, esto significa que funciona en todos los sistemas operativos. Además, es mejor que otras soluciones mostradas aquí en términos de ejecutar el comando una sola vez para un montón de cambios en el sistema de archivos, no una vez por cada archivo modificado, mientras que al mismo tiempo ejecuta el comando una segunda vez si algún archivo cambia de nuevo mientras se está ejecutando el comando.
Por el lado negativo, el sondeo significa que hay una latencia de 0,0 a 1,0 segundos, y por supuesto es lento para monitorear directorios extremadamente grandes. Dicho esto, nunca he encontrado un proyecto lo suficientemente grande como para que esto se note, siempre y cuando uses ‘-i’ para ignorar cosas grandes como tu virtualenv y tus módulos de nodos.
Hmmm. rerun
ha sido indispensable para mí durante años - básicamente lo uso ocho horas cada día para hacer pruebas, reconstruir archivos de puntos a medida que los edito, etc. Pero ahora vengo a escribir esto aquí, está claro que necesito cambiar a una solución que use inotify (ya no uso Windows u OSX.) y que esté escrita en Bash (por lo que funciona con alias sin ningún tipo de manipulación extra.)