誰がデータを食べていますか? Xargs?

誰がデータを食べていますか? Xargs?

組み込みの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 errorsLinting出力を渡すファイルには行が含まれ、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 headwithを使用して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

関連情報