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

用于自动执行并行grep的简单Makefile返回错误,makefile,gnu-parallel,Makefile,Gnu Parallel,我经常使用Makefiles来自动执行重复执行的任务。例如,一项任务涉及搜索不断增长的数据集以查找正则表达式匹配项。假设我有以下两个文本文件,search1.txt,和search2.txt: DSADJKBSDJSA TEST1 DJKSABVDJSA hvdsjhavdjshavdsa dsadsadsadsa TEST3djsabdjhsavdjhsa TEST2dsajdbsahjdvsa search1.txt: DSADJKBSDJSA TEST1 DJKSABVDJSA hv

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

DSADJKBSDJSA
TEST1
DJKSABVDJSA
hvdsjhavdjshavdsa
dsadsadsadsa
TEST3djsabdjhsavdjhsa
TEST2dsajdbsahjdvsa
search1.txt

DSADJKBSDJSA
TEST1
DJKSABVDJSA
hvdsjhavdjshavdsa
dsadsadsadsa
TEST3djsabdjhsavdjhsa
TEST2dsajdbsahjdvsa
search2.txt

DSADJKBSDJSA
TEST1
DJKSABVDJSA
hvdsjhavdjshavdsa
dsadsadsadsa
TEST3djsabdjhsavdjhsa
TEST2dsajdbsahjdvsa
下面是我的Makefile,它使用gnupallel并行搜索这些文件

.PHONY: search
search:
    find search*.txt | parallel grep TEST1 {}
    find search*.txt | parallel grep TEST2 {}
当我运行
makesearch
时,第一行输出正确的数据,然后抛出一个错误并退出,尽管单独运行这两行可以很好地完成

> 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

我一辈子都搞不清楚我做错了什么。这肯定是显而易见的,但我已经将其浓缩到一个如此简单的小例子中,我仍然不明白为什么会发生这种情况。谢谢你对我的帮助

啊哈!我想出来了。结果表明,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