用于自动执行并行grep的简单Makefile返回错误

时间:2016-08-30 20:03:04

标签: makefile gnu-parallel

我经常使用Makefile来自动执行我反复执行的任务。例如,一项任务涉及在不断增长的数据集中搜索正则表达式匹配。假设我有以下两个文本文件search1.txtsearch2.txt

search1.txt

DSADJKBSDJSA
TEST1
DJKSABVDJSA

search2.txt

hvdsjhavdjshavdsa
dsadsadsadsa
TEST3djsabdjhsavdjhsa
TEST2dsajdbsahjdvsa

这是我的Makefile,使用GNU parallel并行搜索这些。

.PHONY: search
search:
    find search*.txt | parallel grep TEST1 {}
    find search*.txt | parallel grep TEST2 {}

当我运行make search时,第一行输出正确的数据,然后抛出错误并退出,尽管自己运行这两行完全没问题。

> make search
find *.txt | parallel grep TEST1 {}
TEST1
make: *** [search] Error 1
> find *.txt | parallel grep TEST1 {}
TEST1
> find *.txt | parallel grep TEST2 {}
TEST2dsajdbsahjdvsa
> parallel --version
GNU parallel 20160822

我不能为我的生活弄清楚我做错了什么。它必须是显而易见的东西,但我把它简化为一个简单的小例子,我仍然对为什么会发生这种情况感到困惑。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

啊哈哈!我想到了。事实证明,grep具有导致此问题的退出状态。从grep手册页:

EXIT STATUS
     The grep utility exits with one of the following values:

     0     One or more lines were selected.
     1     No lines were selected.
     >1    An error occurred.

由于我搜索的某些文件不包含匹配项,因此grep将返回退出状态1.这有一个非常简单的修复:

.PHONY: search
search:
    find search*.txt | parallel grep TEST1 {} || true
    find search*.txt | parallel grep TEST2 {} || true