Controlando a saída de curvas no Debian

0

Gostaria de executar um comando curl e ter apenas conteúdo escrito para stdout se houver um erro.

Quando executo o comando do terminal, obtenho essa funcionalidade por padrão. Quando executo o comando a partir de um script perl embora (''), ele exibe as informações de progresso, mas não as mensagens de erro.

Consigo ocultar as informações de progresso anexando o sinalizador -s ( --silent ), mas não posso forçar a exibição de erros do modo como eles são executados diretamente do bash. O sinalizador -S ( --show-errors ) parece não ter efeito.

Eu também tentei brincar com o desvio da saída para / etc / null, mas isso parece impedir que nada seja produzido.

my $curl_result = 'curl -s -S -X PUT "$url" -H "$h1" -H "$h2" -H "$h3"  -d  "$data"';

Abaixo está um exemplo do tipo de erro que eu gostaria de procurar. Este é causado por um IP intencionalmente mal formado:

{
    "code":"INVALID_RECORDS",
    "message":"One or more of the given records is invalid",
    "fields": [{
        "code":"INVALID_RECORDS",
        "message":"Invalid [ipaddress] provided for record data, [test].",
        "path":"records"
    }],
    "name":"ApiError",
    "errors":["Invalid [ipaddress] provided for record data, [test]."]
}
    
por Nathan Wiles 15.04.2018 / 19:23

2 respostas

0

Você precisa distinguir entre os erros que o curl vê e os erros que o seu servidor http está retornando. Estes últimos não são erros de ondulação. No entanto, você pode inspecionar facilmente o código de status http, adicionando ao seu curl a opção

 -w '\n%{http_code}\n'

Isso será anexado ao stdout do cabeçalho HTTP, que é 200 para OK. Então o seu perl pode fazer algo parecido com

my $curl_result = 'curl -s -S -w '\n%{http_code}\n' ... 2>/dev/null';
my @lines = split(/\n/,$curl_result);
my $httpcode = $lines[-1];
if($httpcode eq 200){ print "ok\n"; }
else{ print "error\n"; }
    
por 16.04.2018 / 14:22
0

O operador backtick do Perl retornará (para sua variável $ curl_result) o STDOUT do comando que você executa. STDERR daquele comando irá passar para o programa de chamada / terminal do seu script perl - talvez para a sua tela, como se você tivesse chamado curl você mesmo.

Para capturar o STDERR, você deve (como você começou a imaginar) largar o STDOUT ou misturar os dois.

Aqui está um exemplo de descarte de STDOUT e redirecionamento de STDERR para STDOUT, para que ele (em vez do STDOUT "normal") seja capturado pela variável perl:

my $curl_result = 'curl ... 2>&1 1>/dev/null';

Alternativamente, misture os dois:

my $curl_result = 'curl ... 2>&1';

Eu omiti o meio do comando curl em massa para deixar claro qual parte eu mudei. O primeiro exemplo muda STDERR para apontar para onde STDOUT está atualmente apontando, então diz para STDOUT ir embora. O segundo exemplo diz STDERR para apontar para STDOUT, misturando os dois.

    
por 16.04.2018 / 02:34