Инвертированный код завершения запуска команды lint в Makefile

Эта запись в моем Makefile успешно сканирует мои PHP-файлы и запускает встроенную в них PHP-функцию:

lint:
@find . -name "*.php" | grep -v "^./lib" | grep -v "^./vendor" | xargs -I{} php -l '{}' | grep -v "No syntax errors detected"

grep -v подавляет все сообщения «Синтаксические ошибки не обнаружены», которые в противном случае могли бы генерироваться, в то время как сообщения о сбоях, если таковые имеются.

Проблема в том, что make умирает, когда нет синтаксических ошибок, и продолжает, когда есть ошибки. Это из-за кода выхода из grep -v, Он думает, что успешно, когда он находит что-то (сообщение об ошибке) и потерпел неудачу, когда он ничего не находит (все файлы переданы lint).

Я смотрел на отрицание кода выхода последнего вызова grep с !:

lint:
@find . -name "*.php" | grep -v "^./lib" | grep -v "^./vendor" | xargs -I{} php -l '{}' | ! grep -v "No syntax errors detected"

но это дает мне:

/bin/sh: -c: line 0: syntax error near unexpected token `!'

я могу использовать ! в командной строке хорошо, но в этом контексте это не работает по какой-то причине.

Мне интересно, как я отменяю код выхода в контексте конвейера / xargs / grep / make. Но в основном я хочу решить свою проблему — открыться для любых предложений, которые приводят к тому, что в моём Makefile работает целевая цель, которая делает правильные вещи.

0

Решение

Возвращаемое значение трубы — это то, которое возвращается его последняя команда. Так что вам нужно просто вернуть статус полной командной строки:

lint:
@! find ... | grep -v "No syntax errors detected"
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]