可以将bash脚本挂接到文件吗?


32

我希望脚本进入睡眠状态,除非修改/删除了某个文件(或在某个目录中创建的文件,或者...)。能否以某种优雅的方式实现?我想到的最简单的事情是一个循环,它会休眠一段时间,然后再次检查状态,但是也许有一种更优雅的方法?

Answers:


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
大多数联合国大学都有类似的功能。不幸的是,每个都有其自己的接口,并且许多都没有shell API。
吉尔(Gilles)“所以,别再邪恶了”,


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

有趣,但很奇怪。那么...它在标准输入上读取了一堆文件名,并在其中一个更改时运行指定的命令?
Tripleee

看起来很有趣,谢谢!是否可以entr通过任何方式传递已更改的文件的名称?
Tobias Kienzler 2013年

从2.7版本开始,特殊/_参数(与$Perl中的_ 相似)被替换为第一个已更改文件的名称
eradman 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.