我的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"