我正在寻找一种方法,一旦子目录中的任何文件(可能减去选定的排除项)发生更改,即可重新运行特定命令。
使用案例
我正在开发一个在目录中独立的项目。例如,可以使用make
.我想利用我机器的空闲时间来重复编译该项目。一种选择是make
每秒调用一次,例如使用watch (1)
.但是,如果make
失败,那么再次执行时通常也会失败,从而浪费 CPU 处理能力(更重要的是,还会使我的笔记本电脑升温)。
相反,应该有一个进程来监视所有文件,并make
仅在项目所在目录发生任何更改后才运行(或任何其他工具)。
现有解决方案
还有人问:bash 脚本可以连接到文件吗?有inotifywait (1)
,但它似乎没有一个很好的界面来重复命令。另外,还有entr (1)
一种看起来可行的方法,但仔细检查一下项目的网站揭示了
[i]很早就确定
entr
不会实现自己的文件搜索语法,而是依赖标准 Unix 工具。
我很懒。我不想为重复调用编写循环make
。有没有更高级的魔法工具可以让我写
magic make
效果是make
每次都重新运行的任何事物在当前目录改变?
注意: 如果这个神奇的工具能够意识到使用inotify
: 发出调用后但建立监视之前发生的变化时不可避免的竞争条件,那就太理想了。我不确定是否entr
可以做到这一点,看起来此功能需要跟踪至少所有受影响文件的时间戳的某种快照。
无耻的自我推销:我自己的四行代码(在某种程度上)实现了这一点,称为rpt
并且远非完美,我想知道我是否在这里重复工作。
答案1
也许ls <dir> | entr make <file>
会起作用。只有 inotifywait 才会开始创建文件。
如果您需要传递文件名,请使用此答案的注释中的信息:https://unix.stackexchange.com/a/81704/346155