Простой Makefile для автоматизации параллельного grep возвращает ошибку
Я часто использую Makefiles для автоматизации задач, которые выполняю неоднократно. Например, одна задача включает поиск растущего набора данных для совпадений регулярных выражений. Предположим, у меня есть следующие два текстовых файла, search1.txt
, а также search2.txt
:
search1.txt
:
DSADJKBSDJSA
TEST1
DJKSABVDJSA
search2.txt
:
hvdsjhavdjshavdsa
dsadsadsadsa
TEST3djsabdjhsavdjhsa
TEST2dsajdbsahjdvsa
Вот мой Makefile для параллельного поиска по GNU.
.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 ответ
Ах, ха! Я понял. Оказывается, что 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