Semplice, usando inotifywait (installa il file inotify-tools
della tua distribuzione pacchetto):
while inotifywait -e close_write myfile.py; do ./myfile.py; done
o
inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
./myfile.py # or "./$filename"
done
Il primo snippet è più semplice, ma ha uno svantaggio significativo:perderà le modifiche eseguite mentre inotifywait
non è in esecuzione (in particolare mentre myfile
è in esecuzione). Il secondo frammento non ha questo difetto. Tuttavia, fai attenzione perché presuppone che il nome del file non contenga spazi bianchi. Se questo è un problema, usa il --format
opzione per modificare l'output in modo da non includere il nome del file:
inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
./myfile.py
done
Ad ogni modo, c'è una limitazione:se qualche programma sostituisce myfile.py
con un file diverso, piuttosto che scrivere nel myfile
esistente , inotifywait
morirà. Molti editor lavorano in questo modo.
Per superare questa limitazione, usa inotifywait
nella directory:
inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
if [ "$filename" = "myfile.py" ]; then
./myfile.py
fi
done
In alternativa, usa un altro strumento che utilizza la stessa funzionalità di base, come incron (ti consente di registrare eventi quando un file viene modificato) o fswatch (uno strumento che funziona anche su molte altre varianti di Unix, usando l'analogo di ogni variante di inotify di Linux). /P>
entr (http://entrproject.org/) fornisce un'interfaccia più amichevole per inotificare (e supporta anche *BSD e Mac OS X).
Rende molto facile specificare più file da guardare (limitato solo da ulimit -n
), semplifica la gestione della sostituzione dei file e richiede meno sintassi bash:
$ find . -name '*.py' | entr ./myfile.py
L'ho utilizzato sull'intero albero dei sorgenti del mio progetto per eseguire i test unitari per il codice che sto attualmente modificando, ed è già stato un enorme impulso al mio flusso di lavoro.
Flag come -c
(cancella lo schermo tra una corsa e l'altra) e -d
(esci quando un nuovo file viene aggiunto a una directory monitorata) aggiungi ancora più flessibilità, ad esempio puoi fare:
$ while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; done
All'inizio del 2018 è ancora in fase di sviluppo attivo e può essere trovato in Debian e Ubuntu (apt install entr
); la compilazione dal repository dell'autore è stata in ogni caso indolore.
Ho scritto un programma Python per fare esattamente questo chiamato when-changed.
L'utilizzo è semplice:
when-changed FILE COMMAND...
O per guardare più file:
when-changed FILE [FILE ...] -c COMMAND
FILE
può essere una directory. Guarda in modo ricorsivo con -r
. Usa %f
per passare il nome del file al comando.