在Makefile中运行lint命令的反向退出代码


Inverted exit code running lint command in a Makefile

我的Makefile中的这个条目愉快地抓取我的PHP文件,并在它们上运行PHP的内置lint:

lint:
    @find . -name "*.php" | grep -v "^./lib" | grep -v "^./vendor" | xargs -I{} php -l '{}' | grep -v "No syntax errors detected"

grep -v抑制所有"未检测到语法错误"消息,否则这些消息将在仍然存在故障消息(如果有的话)的情况下生成。

问题是,make在没有语法错误的情况下会消亡,而在出现错误时会继续。这是因为grep -v的退出代码。当它发现一些东西(错误消息)时,它认为它已经成功,而当它什么都没发现时(所有文件都传递了lint),它就失败了。

我考虑用!:否定最后一次调用grep的退出代码

lint:
    @find . -name "*.php" | grep -v "^./lib" | grep -v "^./vendor" | xargs -I{} php -l '{}' | ! grep -v "No syntax errors detected"

但这给了我:

/bin/sh: -c: line 0: syntax error near unexpected token `!'

我可以在命令行中使用!,但在这种情况下,由于某种原因,它不起作用。

我很好奇如何在管道/xargs/grep/make的上下文中否定退出代码。但最重要的是,我想解决我的问题——对任何在我的Makefile中产生工作lint目标并做正确事情的建议持开放态度。

管道的返回值是其最后一个命令返回的值。所以你只需要恢复完整命令行的状态:

lint:
    @! find ... | grep -v "No syntax errors detected"