Как выровнять все файлы рекурсивно при распечатке только файлов с ошибкой?

Я хочу связать все файлы в текущем (рекурсивном) каталоге, одновременно распечатывая только те файлы, в которых есть ошибки, и назначить для переменной значение 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 ошибка возвращается.

2 ответа

Решение

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