很简单,使用 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
没有运行时执行的更改(特别是当--format
运行时)。第二个代码段没有这个缺陷。但是,要注意的是,它假定文件名中不包含空格。如果这是一个问题,可以使用myfile.py
选项来改变输出不包含文件名:
inotifywait -q -m -e close_write --format %e myfile.py |
while read events; do
./myfile.py
done
无论哪种方式,都有一个限制:如果某些程序用不同的文件替换了myfile
,而不是写到现有的inotifywait
,inotifywait
就会死掉。很多编辑器都是这样工作的。
要克服这个限制,在目录上使用&007:
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(一个也可以在许多其他Unix变体上工作的工具,使用Linux的inotify的类似物)。