有没有比"制表"更聪明的替代品?

Dob*_*eer 28 makefile watch

我遇到了这个有用的提示,如果你正在处理很多文件而你希望它们自动构建,你可以运行:

看做

它会重新运行,每隔几秒就可以生成一些东西.

但是......它似乎总是吞下所有的输出.我认为它可能更聪明 - 也许显示输出流但是禁止为'all'做任何事情,这样如果没有构建,输出就不会滚动.

使用循环和grep可以想到一些shell脚本方法...但也许更优雅的东西呢?有人见过什么吗?

Ott*_*ger 41

使用经典gnu makeinotifywait没有基于区间的轮询:

watch:
    while true; do \
        make $(WATCHMAKE); \
        inotifywait -qre close_write .; \
    done
Run Code Online (Sandbox Code Playgroud)

这种方式在当前目录树中的每个文件写入时触发.您可以通过运行指定目标

make watch WATCHMAKE=foo
Run Code Online (Sandbox Code Playgroud)

  • 对于 macOS,“brew install fswatch”并将第 4 行替换为“fswatch -1”。 (3认同)

wch*_*wch 11

这个单行应该这样做:

while true; do make --silent; sleep 1; done
Run Code Online (Sandbox Code Playgroud)

make每秒运行一次,它只会在实际执行某些操作时打印输出.


小智 6

怎么样

# In the makefile:
.PHONY: continuously
continuously:
    while true; do make 1>/dev/null; sleep 3; done  
Run Code Online (Sandbox Code Playgroud)

这样你就可以跑了

持续不断

如果出现问题,只能获得输出.


dan*_*nza 6

Twitter Bootstrap watchr为此使用了ruby gem.

https://github.com/twbs/bootstrap/blob/v2.3.2/Makefile

https://github.com/mynyml/watchr

编辑:

两年后,该watchr项目似乎不再维持.请在答案中寻找其他解决方案.就个人而言,如果目标只是为了获得更好的输出,我会这里推荐答案wch


Chr*_*ick 6

这是一个单行:

while true; do make -q || make; sleep 0.5; done
Run Code Online (Sandbox Code Playgroud)

如果有什么要做的话,使用make -q || make而不是make只运行构建,否则不会输出任何消息.

您可以将此作为规则添加到项目的Makefile中:

watch:
    while true; do $(MAKE) -q || $(MAKE); sleep 0.5; done
Run Code Online (Sandbox Code Playgroud)

然后make watch用来调用它.

这种技术将阻止Make使用"make:TARGET无法完成"消息来填充终端.

它也没有像一些文件监视器解决方案那样保留一堆打开的文件描述符,这会导致ulimit错误.