組み込みのPHPリンターを使用してPHPファイルの再帰ディレクトリを解析しようとしています。これは次のように機能します。
$ php -l good.php
No syntax errors detected in good.php
$ php -l bad.php
PHP Parse error: syntax error, unexpected ''foo'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in bad.php on line 3
Errors parsing bad.php
No syntax errors
Linting出力を渡すファイルには行が含まれ、Linting出力を渡さないファイルには行が含まれていることがわかりますErrors parsing
。
現在のディレクトリに12147個のPHPファイルが繰り返しありますが、PHP linterは7行だけを出力します。
$ find . -name \*.php -print0 | xargs -0 ls -l | wc -l
12147
$ find . -name \*.php -print0 | xargs -0 php -l | wc -l
7
PHPは7つのファイルのみを解析したので、my head
withを使用してls
まだ解析されていないいくつかのファイルを見つけることができます。
$ find . -name \*.php -print0 | xargs -0 ls -l | head
-rw-r--r-- 1 dotan dotan 1927 Jan 13 10:13 ./bootstrap/app.php
-rw-r--r-- 1 dotan dotan 1076 Jan 13 10:13 ./bootstrap/autoload.php
-rw-rw-r-- 1 dotan dotan 25620 Mar 12 12:29 ./bootstrap/cache/services.php
-rw-r--r-- 1 dotan dotan 2493 Jan 13 10:13 ./bootstrap/paths.php
-rwxrwxr-x 1 dotan dotan 20008 Mar 12 12:30 ./config/app.php
-rw-r--r-- 1 dotan dotan 3304 Jan 13 10:13 ./config/auth.php
-rw-r--r-- 1 dotan dotan 1819 Jan 13 10:13 ./config/cache.php
-rw-r--r-- 1 dotan dotan 3751 Jan 13 10:13 ./config/cartalyst.sentinel-addons.social.php
-rw-r--r-- 1 dotan dotan 6849 Jan 13 10:13 ./config/cartalyst.sentinel.php
-rw-r--r-- 1 dotan dotan 1020 Jan 13 10:13 ./config/compile.php
xargs: ls: terminated by signal 13
$ find . -name \*.php -print0 | xargs -0 php -l
No syntax errors detected in ./bootstrap/paths.php
No syntax errors detected in ./vendor/watson/validating/src/ValidatingTrait.php
No syntax errors detected in ./vendor/giggsey/libphonenumber-for-php/src/libphonenumber/data/PhoneNumberMetadata_SI.php
No syntax errors detected in ./vendor/php-vcr/php-vcr/src/VCR/Event/BeforePlaybackEvent.php
No syntax errors detected in ./vendor/laravel/framework/src/Illuminate/Support/Facades/Blade.php
No syntax errors detected in ./resources/views/emails/appointment/updated/body.blade.php
No syntax errors detected in ./app/WL/Modules/Location/Commands/RemoveClientLocationCommand.php
ただし、これらのファイルのいずれかを解析しようとすると、予想される出力(構文解析パススルーまたは失敗)が生成されることがわかりました。
$ php -l ./bootstrap/cache/services.php
No syntax errors detected in ./bootstrap/cache/services.php
確認してもLintingを通過したり失敗したりしないと、予想される行がstderrに印刷されます。
$ php -l good.php | grep rr
No syntax errors detected in good.php
$ php -l bad.php | grep rr
PHP Parse error: syntax error, unexpected ''foo'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' in bad.php on line 3
Errors parsing bad.php
今何を確認する必要がありますか?私の究極の目標は、すべてのファイルを確認し、grepを使用してError parsing
修正することです。
答え1
xargsが有効であることを確認するには、xargsが実行されるコマンドラインを実行します。危険を冒さずに実行中の内容を正確に確認する方法は次のとおりです。変化実行される内容:
- 一時ディレクトリに呼び出されるスクリプトを作成し、
php
この$PATH
スクリプトに引数を記録します(その後、オプションで実際の引数を実行できますphp
)。 - ロギングメカニズム(例
strace
:。
コマンドが次のようになることがわかります。
php -l ./bootstrap/app.php ./bootstrap/autoload.php ./bootstrap/cache/services.php …
次のステップは、このコマンドが実行する操作を調べることです。
私はそれに慣れていませんが、php
最初のファイル名だけがPHPスクリプト名として扱われ、リントモードではすべての後続の引数を無視します。したがって、グループ化アクションをphp -l
使用する代わりに、各スクリプトを一度に合計12147回実行する必要があります。xargs
最も簡単な方法は
find . -name \*.php -exec php -l {} \;
php
ただし、このコマンドは、一部の呼び出しがゼロ以外の状態を返しても常にゼロを返します。 21世紀には、findはほとんどxargsを必要としませんが、xargsの1つの利点は、コマンド呼び出しがゼロ以外の状態を返す場合はゼロ以外の状態を返すことです。したがって、xargsを実行しますが、このオプションを使用して一度に1つのファイルのみを処理するように指示します-n
。
find . -name \*.php -print0 | xargs -0 -n 1 php -l