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 / computer / Perguntas / 1717614
Accepted
Alan H.
Alan H.
Asked: 2022-04-23 14:51:49 +0800 CST2022-04-23 14:51:49 +0800 CST 2022-04-23 14:51:49 +0800 CST

Posso gerar a resposta 'curl' ao mesmo tempo em que verifica a presença da string ERROR?

  • 772

Eu tenho um comando com o qual estou executando curl. O comando curl sempre resolve com sucesso, mesmo quando a resposta do servidor inclui a string ERROR em algum lugar.

Posso de alguma forma detectar essa resposta com algum tipo de script ou função de shell (preferencialmente zsh), enquanto também encaminha a saída para o terminal e torna o comando geral falso?

bash command-line
  • 2 2 respostas
  • 3090 Views

2 respostas

  • Voted
  1. dominix
    2022-04-23T15:56:57+08:002022-04-23T15:56:57+08:00

    Não sei exatamente o que você deseja alcançar, mas acho que você precisa de um teeou de um redirecionamento da saída de errocurl -s whatever 2>&1|tee output.txt|grep ERROR

    então ambos têm o grep do erro e o conteúdo do comando curl no arquivo output.txt.

    • 2
  2. Best Answer
    Kamil Maciorowski
    2022-04-24T16:01:16+08:002022-04-24T16:01:16+08:00

    Por favor, veja a primeira parte desta outra resposta minha e os links nela. Você deseja detectar uma string. Fazer curlfalhar de acordo com o código de erro HTML parece mais elegante. Se for possível obter o resultado desejado desta forma, então é o Caminho Certo.

    Caso contrário, use a seguinte função shell de uso geral:

    failon() (
      pattern="$1"
      shift
      [ "$#" -eq 0 ] && set cat
      FAILON_STATUS="${FAILON_STATUS:-125}"
      set -o pipefail
      { "$@" \
        | tee -p /proc/self/fd/3 \
        | { grep -q -- "$pattern" && return "$FAILON_STATUS" || return 0; }
      } 3>&1
    )
    

    Uso:

    failon [pattern [command [arg...]]]
    

    O objetivo principal da função é retornar o status de saída diferente de zero se a saída de command [arg...]contiver uma linha correspondente ao pattern. A saída é impressa no stdout da função, independentemente de haver uma correspondência ou não.

    Exemplo:

    failon ERROR curl …
    

    Observações e explicações:

    • O patterné fornecido como está para grep, portanto, é um regex. Um vazio ou indefinido patterncorresponderá a qualquer linha, se apenas houver uma linha.

    • A função deve funcionar em bash, zsh e muitos outros shells. AFAIK a sintaxe do shell que usei é portátil. Coisas não portáteis são independentes do shell, exceto set -o pipefailo que pertence ao shell e não é portátil. Quero dizer ainda não. É amplamente suportado e será adicionado ao padrão POSIX .

    • Graças a pipefail, se o padrão não for encontrado e teenão falhar (normalmente não deve falhar), a função retornará o status de saída do comando especificado (por exemplo curl, ).

    • Se o padrão for encontrado, a função retornará 125. Eu escolhi 125porque:

      • não é reservado ,

      • man 1 curlno meu sistema operacional especifica códigos de saída até 96já e mais podem aparecer no futuro.

      Você pode ajustar esse número às suas necessidades por FAILON_STATUSmeio da variável de ambiente. Por exemplo FAILON_STATUS=120 failon …. A nota FAILON_STATUS=0é tecnicamente válida, mas bastante inútil.

    • tee -pnão é portátil. Sem -p teesairá se ficar SIGPIPEdepois grepde sair mais cedo. grep -qsai assim que encontra o padrão. Graças a -p teeirá retransmitir toda a sua entrada para /proc/self/fd/3(que é, em última análise, o stdout da função), mesmo que grepsaia mais cedo.

      Se você teenão oferece suporte -p, a solução mais simples é usar grep -- "$pattern" >/dev/null. Agora grepprocessará silenciosamente todos os dados, não sairá mais cedo. A desvantagem é que ele fará linhas de correspondência de trabalho desnecessárias depois que o padrão for encontrado pela primeira vez.

    • /proc/self/fd/…não é portátil; espero que seu sistema operacional suporte isso. Mesmo que isso não aconteça, sempre há um método curl … | tee /temporary/fileseguido por ! grep -q ERROR /temporary/filepara obter o status de saída falso em ERROR. Este método é bastante direto e KISS , mas:

      • em um de seus comentários você disse que não quer salvar a saída em um arquivo;

      • em geral, não é fácil criar um arquivo /temporary/file; mktempé a ferramenta certa, mas não é especificada pelo POSIX.

    • Em zsh você pode fazer "$@" >&3 | { grep -q …(em vez de "$@" | tee … | { grep -q …) e assim se livrar de tee -p /proc/self/fd/3qualquer problema potencial dele.

    • --é explicado aqui: O que significa --(traço duplo)?

    • Se commandnão for especificado, a função usará cat. Isso permite que você use failoncomo um "filtro":

      curl … | failon ERROR
      

      Observe que é fácil perder o status de saída curldessa maneira. Por outro lado, é possível fazer isso:

      curl … | failon ERROR | failon WARNING
      

      e examine PIPESTATUS(no bash) ou pipestatus(no zsh) para detectar ERRORe WARNINGna saída independentemente.

    • Alguns programas mudam seu comportamento, dependendo de stdout ser um terminal, um pipe ou um arquivo regular (veja como enganar um comando para pensar que sua saída está indo para um terminal ). Nossa função usa internamente um pipe, então em alguns casos a saída de failon foo programserá diferente da saída da mesma programinvocada diretamente.

    • 2

relate perguntas

  • Existe um equivalente a cd - para cp ou mv?

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Não é possível ativar o Microsoft Print to PDF depois de desativado

  • Notificar-enviar notificações aparecendo na janela

  • como abrir um arquivo de escritório do WSL

Sidebar

Stats

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

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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