Я хотел бы выполнить строгую проверку синтаксиса:
$ php -d error_reporting=32767 -l test.php
для всех php файлов внутри моего проекта в Travis CI.
Я пытался использовать find, но он всегда возвращает 0, даже если команда для флага exec не выполняется
$ find . -type f -name "*.php" -exec php -d error_reporting=32767 -l {} \;
PHP Parse error: syntax error, unexpected end of file, expecting ',' or ';' in ./test.php on line 3
$ echo $?
0
Я решил это, проверив, возвращает ли find + php что-то в STDERR.
before_script:
- '! find . -type f -name "*.php" -exec php -d error_reporting=32767 -l {} \; 2>&1 >&- | grep "^"'
Как это работает? Добавление:
2>&1 >&-
после любой команды удаляет STDOUT и перенаправляет STDERR на STDOUT.
Затем мы можем просто проверить, содержит ли вывод строки с grep:
| grep "^"
Тогда, поскольку grep возвращает 0, если он находит что-либо и 1, если он не находит ничего, что нам нужно, чтобы отрицать конечный результат, используя восклицательный знак в начале этой команды. В противном случае эта команда потерпит неудачу, когда все будет в порядке и удастся, когда ситуация потерпит неудачу.