Я хочу связать все файлы в текущем (рекурсивном) каталоге, распечатывая только те файлы, в которых есть ошибки, и назначить для переменной значение 1, которое будет использоваться после завершения лининга.
#!/bin/bash
lint_failed=0
find . -path ./vendor -prune -o -name '*.php' | parallel -j 4 sh -c 'php -l {} || echo -e "[FAIL] {}" && lint_failed=1';
if [ "$lint_failed" -eq "1" ]; then
exit 1
fi
пример:
[FAIL] ./app/Model/Example.php
Приведенный выше код не находит никаких ошибок, но если я запускаю php -l ./app/Model/Example.php
ошибка возвращается.
parallel
Команда уже делает то, что вы хотите: она выходит из 0, если все задания выходят из 0, и она выходит из ненулевого значения, если любое из заданий выходит из ненулевого значения. parallel
Опции выхода настраиваются, см. EXIT STATUS
раздел man parallel
для деталей.
В вашем сценарии использование || echo
скрывает состояние выхода из заданий, но вы можете снова выставить это, выполнив что-то вроде этого (протестировано bash 4.4.7 на Ubuntu):
#!/bin/bash
php_lint_file()
{
local php_file="$1"php -l "$php_file" &> /dev/null
if [ "$?" -ne 0 ]
then
echo -e "[FAIL] $php_file"return 1
fi
}
export -f php_lint_file
find . -path ./vendor -prune -o -name '*.php' | parallel -j 4 php_lint_file {}
if [ "$?" -ne 0 ]
then
exit 1
fi
Ты можешь использовать PHP Parallel Lint инструмент который проверяет синтаксис PHP-файлов быстрее и с более привлекательным выводом, выполняя параллельные задания, одновременно распечатывая только файлы с ошибками.
Пример использования:
./bin/parallel-lint --exclude app --exclude vendor .
Или с помощью муравья build.xml
:
<condition property="parallel-lint" value="${basedir}/bin/parallel-lint.bat" else="${basedir}/bin/parallel-lint">
<os family="windows"/>
</condition>
<target name="parallel-lint" description="Run PHP parallel lint">
<exec executable="${parallel-lint}" failonerror="true">
<arg line="--exclude" />
<arg path="${basedir}/app/" />
<arg line="--exclude" />
<arg path="${basedir}/vendor/" />
<arg path="${basedir}" />
</exec>
</target>