5

我想对当前(递归)目录中的所有文件进行 lint,同时仅打印出有错误的文件,并将一个变量分配给 1 以在 linting 完成后使用。

#!/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

示例

[失败] ./app/Model/Example.php

上面的代码没有发现任何错误,但是如果我运行php -l ./app/Model/Example.php则会返回错误。

4

2 回答 2

4

parallel命令已经完成了您想要的操作:如果所有作业退出 0,它将退出 0,如果任何一个作业退出非零,则它退出非零。parallel的退出选项是可配置的,请参阅 的EXIT STATUS部分man parallel了解详细信息。

在您的脚本中,使用|| echo掩盖了作业的退出状态,但您可以再次公开它做这样的事情(在 ubuntu 上测试 bash 4.4.7):

#!/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
于 2018-01-03T23:04:40.090 回答
1

您可以使用PHP Parallel Lint工具,该工具通过运行并行作业来更快地检查 PHP 文件的语法并提供更精美的输出,同时仅打印出有错误的文件。

示例用法:

./bin/parallel-lint --exclude app --exclude vendor .

或使用 Ant 的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>
于 2018-01-19T21:26:03.770 回答