用于自动执行并行grep的简单Makefile返回错误
我经常使用Makefiles来自动执行重复执行的任务。例如,一项任务涉及搜索不断增长的数据集以查找正则表达式匹配项。假设我有以下两个文本文件,用于自动执行并行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
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