Simples, usando inotifywait (instale o pacote inotify-tools
da sua distribuição):
while inotifywait -e close_write myfile.py; do ./myfile.py; done
ou
inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
./myfile.py # or "./$filename"
done
O primeiro snippet é mais simples, mas tem uma desvantagem significativa: ele perderá as alterações realizadas enquanto inotifywait
não estiver em execução (em especial, enquanto myfile
estiver em execução). O segundo trecho não tem esse defeito. No entanto, tenha em atenção que pressupõe que o nome do ficheiro não contém espaço em branco. Se isso for um problema, use a opção --format
para alterar a saída para não incluir o nome do arquivo:
inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
./myfile.py
done
De qualquer forma, há uma limitação: se algum programa substituir myfile.py
por um arquivo diferente, em vez de gravar no myfile
existente, inotifywait
morrerá. Muitos editores trabalham dessa maneira.
Para superar essa limitação, use inotifywait
no diretório:
inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
if [ "$filename" = "myfile.py" ]; then
./myfile.py
fi
done
Como alternativa, use outra ferramenta que use a mesma funcionalidade subjacente, como incron (permite registrar eventos quando um arquivo é modificado) ou fswatch (uma ferramenta que também funciona em muitas outras variantes do Unix, usando o análogo de cada variante do inotify do Linux).