내장된 PHP linter를 사용하여 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
그러나 이 명령은 일부 호출이 0이 아닌 상태를 반환 하더라도 항상 0을 반환합니다 . 21세기에는 find가 대부분 xargs를 필요로 하지 않지만 xargs의 한 가지 이점은 명령 호출이 0이 아닌 상태를 반환하는 경우 0이 아닌 상태를 반환한다는 것입니다. 따라서 xargs를 실행하되 이 옵션을 사용하여 한 번에 하나의 파일만 처리하도록 지시하십시오 -n
.
find . -name \*.php -print0 | xargs -0 -n 1 php -l