シンプル、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 バリアントでも動作するツール) など、同じ基本機能を使用する別のツールを使用します。 /P>
エントリー (http://entrproject.org/) は、inotify へのより使いやすいインターフェイスを提供します (また、*BSD および Mac OS X もサポートします)。
監視する複数のファイルを非常に簡単に指定できます (ulimit -n
によってのみ制限されます)。 )、置き換えられるファイルを処理する手間が省け、必要な bash 構文が少なくなります:
$ find . -name '*.py' | entr ./myfile.py
現在変更中のコードの単体テストを実行するために、プロジェクト ソース ツリー全体でこれを使用しており、すでにワークフローが大幅に向上しています。
-c
のようなフラグ (実行間で画面をクリア) と -d
(監視対象のディレクトリに新しいファイルが追加されたときに終了します) さらに柔軟性を追加します。たとえば、次のことができます:
$ while sleep 1 ; do find . -name '*.py' | entr -d ./myfile.py ; done
2018 年の初めの時点で、まだ活発に開発されており、Debian および Ubuntu (apt install entr
) で見つけることができます。 );著者のリポジトリからのビルドは、いずれにせよ簡単でした。
when-changed と呼ばれるまさにこれを行う Python プログラムを作成しました。
使い方は簡単です:
when-changed FILE COMMAND...
または、複数のファイルを見るには:
when-changed FILE [FILE ...] -c COMMAND
FILE
ディレクトリにすることができます。 -r
で再帰的に見る . %f
を使用 ファイル名をコマンドに渡します。