AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 505880
Accepted
dotancohen
dotancohen
Asked: 2019-03-13 05:42:51 +0800 CST2019-03-13 05:42:51 +0800 CST 2019-03-13 05:42:51 +0800 CST

Quem está comendo dados? Xargs?

  • 772

Estou tentando analisar um diretório recursivo de arquivos PHP usando o linter PHP embutido, que funciona assim:

$ 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

Podemos ver que os arquivos que passam o linting produzem uma linha contendo No syntax errorse aqueles que falham o linting produzem uma linha contendo Errors parsing.

Vejo que tenho 12147 arquivos PHP recursivamente no diretório atual, no entanto, o linter do PHP está gerando apenas sete linhas:

$ find . -name \*.php -print0 | xargs -0 ls -l | wc -l
12147

$ find . -name \*.php -print0 | xargs -0 php -l | wc -l
7

Como havia apenas 7 arquivos analisados ​​pelo PHP, posso usar meu headwith lspara encontrar alguns arquivos que não foram analisados:

$ 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

No entanto, quando tento analisar um desses arquivos, vejo que ele produz a saída esperada (passando ou falhando na análise):

$ php -l ./bootstrap/cache/services.php
No syntax errors detected in ./bootstrap/cache/services.php

Verifiquei que nem a passagem nem a falha do linting estão imprimindo as linhas esperadas para 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

O que devo verificar agora? Meu objetivo final é fazer o lint de todos os arquivos e, em seguida, grep para Error parsingcorrigir esses problemas.

bash shell
  • 1 1 respostas
  • 385 Views

1 respostas

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2019-03-13T05:56:14+08:002019-03-13T05:56:14+08:00

    Para ver se xargs faz diferença, execute as linhas de comando que ele executa. Aqui estão algumas maneiras de ver exatamente o que ele executa, sem correr o risco de alterar o que ele executa:

    • Escreva um script chamado phpem um diretório temporário e coloque-o no início de $PATH. Neste script, registre os argumentos (e, opcionalmente, execute o real phpdepois).
    • Execute toda a linha de comando em um mecanismo de log, como strace.

    Você verá que o comando é algo como

    php -l ./bootstrap/app.php ./bootstrap/autoload.php ./bootstrap/cache/services.php …
    

    A próxima etapa é investigar o que esse comando faz.

    Eu não estou familiarizado php, mas acho que ele trata apenas o primeiro nome de arquivo como um nome de script PHP e, no modo lint, ele simplesmente ignora todos os argumentos subsequentes. Portanto, você precisa executar php -luma vez para cada script, 12.147 vezes no total, em vez de usar xargso comportamento de agrupamento do .

    A maneira mais fácil de fazer isso é

    find . -name \*.php -exec php -l {} \;
    

    mas esse comando sempre retornará 0, mesmo que algumas invocações de phpretornem um status diferente de zero. Embora find principalmente não precise de xargs no século 21, um benefício de xargs é que ele retorna um status diferente de zero se qualquer invocação do comando retornar um status diferente de zero. Portanto, execute xargs, mas diga a ele para processar apenas um arquivo por vez com a -nopção.

    find . -name \*.php -print0 | xargs -0 -n 1 php -l
    
    • 7

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • Como salvar um caminho com ~ em uma variável?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve