停止执行if find -exec返回非零

6

我正在尝试将使用pyflakes检查我的代码集成到构建过程中。我已在Makefile中定义了以下目标:

pyflakes:
    find $(APPLICATION_DIRECTORY) -iname "*.py" -exec pyflakes "{}" \;

问题在于,即使存在代码问题(pyflakes返回不为0),find每次都会返回0,而make却成功了。理想情况下,我希望对每个源文件运行检查,并且如果-exec中的至少一个命令失败,则停止make。有没有办法实现这一点呢?
3个回答

5

我认为没有办法使find返回-exec的退出代码。
可以使用管道符号xargs来实现:

find $(APPLICATION_DIRECTORY) -iname "*.py" |xargs -I file pyflakes file 

3

您可以将find的输出导入到您自己的处理循环中,并在pyflakes返回非0的退出状态时退出。

find . -iname '*.jpg' | \
while read line ; do
    pyflakes "$line"
    res=$?
    if [ $res -ne 0 ] ; then
        exit $res
    fi
done

1
cmd; if [ $? -ne 0 ]; then foo; fi 只是一种反模式;正确的编码方式是 if cmd; then foo; fi 或者简单地使用 cmd || foo - tripleee
我没有看到任何改进。你想要的编辑是 pyflakes "$line" || exit $?,简短而简单。 - tripleee
我看不出你的方法有什么优势。关键是它更短吗? - Kim Stebel
最重要的是,在大多数情况下,显式检查 $? 是不符合惯用法的;if 的作用是运行一个命令并检查其退出代码是否为零。 - tripleee

1

让它结束查找过程

pyflakes:
    find $(APPLICATION_DIRECTORY) -iname "*.py" -exec bash -c 'pyflakes {}; if [[ $$? != 0 ]]; then kill -INT $$PPID;fi' \;

这是放入 makefile 的内容,不是脚本文件,如果你对语法有疑问。


1
只需编写“-exec bash -c'pyflakes {} || kill $ PPID';”。 对我来说,这比使用“-quit”谓词慢一点,测试方式为:“find -name'*.cpp' \(-print -a -exec g ++ -c {}; -o -quit \)”。 - Tomasz Gandor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接