GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire un comando ogni volta che un file cambia?

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.


Linux
  1. Come salvare l'output dei comandi in un file in Linux

  2. Come campionare casualmente un sottoinsieme di un file?

  3. Come posso verificare che un file esista ed eseguire un comando in caso contrario?

  4. Come eseguire il file python in linux

  5. Comando della shell per monitorare le modifiche in un file

Come utilizzare un comando file in Linux

Come aprire un file in Linux

Come mescolare le linee in un file in Linux

Come eseguire un comando in uno script della shell?

Come usare il comando lsof in Linux

Come utilizzare il comando shred Linux