Простой 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
Другие вопросы по тегам