bashスクリプトをファイルにフックできますか?


32

特定のファイルが変更/削除されない限り(または特定のディレクトリで作成されたファイル、または...)、スクリプトをスリープさせたい。これはエレガントな方法で達成できますか?私の頭に浮かぶ最も簡単なことは、ステータスを再度確認する前にしばらくスリープするループですが、おそらくもっとエレガントな方法がありますか?

回答:


34

Linuxでは、カーネルのinotify機能を使用できます。スクリプト用のツールは、そこにあります:inotify-tools

wikiからの使用例:

#!/bin/sh

EVENT=$(inotifywait --format '%e' ~/file1) # blocking without looping
[ $? != 0 ] && exit
[ "$EVENT" = "MODIFY" ] && echo 'file modified!'
[ "$EVENT" = "DELETE_SELF" ] && echo 'file deleted!'
# etc...

1
ほとんどの大学には同様の機能があります。残念ながら、それぞれに独自のインターフェイスがあり、多くにはシェルAPIがありません。
ジル「SO-悪であるのをやめる」


3

実際、entr(1)はファイルが変更されると任意のコマンドを実行し、アプリケーションサーバーを再起動するための自動リロードオプションも提供します。

編集:いくつかの例

ソースファイルが変更された場合に再構築する

$ find *.c | entr make

ファイルが変更された場合のテストサーバーの起動と自動再読み込み

$ ls *.py | entr -r python main.py

引数を+/path/to/fifo指定entrすると、名前付きパイプに変更される各ファイルの名前を書き込むように指示することで、より複雑なスクリプトを作成できます。以下は、現在のディレクトリのMarkdownファイルが編集されるとHTMLに変換します

$ ls *.md | entr +/tmp/notify &
$ while read F
> do
>   markdown2html $F
> done < /tmp/notify

興味をそそられますが、奇妙です。だから...それは標準入力でファイル名の束を読み取り、それらのいずれかが変更されたときに指定されたコマンドを実行しますか?
トリプリー

面白そうですね、ありがとう!entr変更されたファイルの名前を渡す方法はありますか?
トビアスキンツラー

2.7リリースの時点で、特別な/_引数($Perlの_に多少類似)は、変更された最初のファイルの名前に置き換えられます
eradman 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.