使用案例

使用案例

我正在寻找一种方法,一旦子目录中的任何文件(可能减去选定的排除项)发生更改,即可重新运行特定命令。

使用案例

我正在开发一个在目录中独立的项目。例如,可以使用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

相关内容