Эта запись в моем 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 работает целевая цель, которая делает правильные вещи.
Возвращаемое значение трубы — это то, которое возвращается его последняя команда. Так что вам нужно просто вернуть статус полной командной строки:
lint:
@! find ... | grep -v "No syntax errors detected"
Других решений пока нет …