シンプルで、 inotifywait (ディストリビューションの inotify-tools
パッケージをインストール) を使用します:
while inotifywait -e close_write myfile.py; do ./myfile.py; done
または
inotifywait -q -m -e close_write myfile.py |
while read -r filename event; do
./myfile.py # or "./$filename"
done
最初のスニペットはよりシンプルですが、大きな欠点があります: inotifywait
が実行されていない間 (特に myfile
が実行されている間) に実行された変更を見逃してしまいます。2 番目のスニペットにはこのような欠陥はありません。しかし、ファイル名に空白が含まれていないことを前提としていることに注意してください。もしそれが問題ならば、--format
オプションを使って、ファイル名を含まないように出力を変更してください:
inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
./myfile.py
done
いずれにしても、制限があります: 何らかのプログラムが myfile.py
を既存の myfile
に書き込むのではなく、別のファイルに置き換えた場合、inotifywait
は死んでしまいます。多くのエディタはこのように動作します。
この制限を克服するには、ディレクトリ上で inotifywait
を使用してください:
inotifywait -e close_write,moved_to,create -m . |
while read -r directory events filename; do
if ["$filename" = "myfile.py"]; then
./myfile.py
fi
done
あるいは、 incron (ファイルが変更されたときにイベントを登録することができます) や fswatch (Linux の inotify のアナログを使用して、他の多くの Unix バリアントでも動作するツールです) のような、同じ基本的な機能を使用する別のツールを使用してください。