Ho scritto un programma Python per fare esattamente questo, chiamato rerun
.
UPDATE: Questa risposta è uno script Python che fa sondaggi per i cambiamenti, che è utile in alcune circostanze. Per uno script Bash solo per Linux che usa inotify, vedi la mia altra risposta, cerca in questa pagina ‘rerun2’.
Installa per Python2 o Python3 con:
pip install --user rerun
e l'uso è molto semplice:
rerun "COMMAND"
``` &001
Il comando è previsto come un singolo argomento, non una sequenza di args separati dallo spazio. Quindi citarlo come mostrato, il che riduce qualsiasi fuga extra che si dovrebbe aggiungere. Basta digitare il comando come lo si sarebbe digitato alla riga di comando, ma circondato da virgolette.
Per default guarda tutti i file nella o sotto la directory corrente, saltando cose come dirs di controllo dei sorgenti conosciuti, .git, .svn, ecc.
I flag opzionali includono '-i NAME' che ignora le modifiche ai file o alle directory con nome. Questo può essere dato più volte.
Poiché è uno script Python, deve eseguire il comando come sotto-processo, e noi usiamo una nuova istanza della shell corrente dell'utente per interpretare 'COMMAND' e decidere quale processo eseguire effettivamente. Tuttavia, se il comando contiene alias di shell e simili definiti in .bashrc, questi non saranno caricati dalla sottostruttura. Per risolvere questo problema, si può dare una ripetizione del flag '-I', per usare sottogusci interattivi (aka 'login'). Questo è più lento e più soggetto a errori rispetto all'avvio di una shell normale, perché deve generare il vostro .bashrc.
Lo uso con Python 3, ma l'ultima volta che ho controllato la ripetizione funzionava ancora con Python 2.
Double-edged sword è che usa il polling invece di inotificare. Il lato positivo è che funziona su tutti i sistemi operativi. Inoltre, è meglio di alcune altre soluzioni qui mostrate in termini di esecuzione del comando dato solo una volta per un gruppo di modifiche al filesystem, non una volta per ogni file modificato, mentre allo stesso tempo esegue il comando una seconda volta se qualche file cambia di nuovo mentre il comando è in esecuzione.
Sul lato negativo, il polling significa che c'è una latenza da 0.0 a 1.0 secondi, e naturalmente è lento a monitorare directory estremamente grandi. Detto questo, non mi sono mai imbattuto in un progetto così grande da poterlo notare fintanto che si usa '-i' per ignorare grandi cose come il virtualenv e i nodi\_moduli.
Hmmm. `rerun` mi è stato indispensabile per anni - in pratica lo uso otto ore al giorno per eseguire test, ricostruire i file di punti mentre li modifico, ecc. Ma ora che sono arrivato a digitare questo qui, è chiaro che devo passare a una soluzione che utilizza inotify (non uso più Windows o OSX.) e che è scritta in Bash (quindi funziona con gli alias senza alcuna manipolazione extra).