控制 Debian 上的 curl 输出

控制 Debian 上的 curl 输出

我想运行一个curl命令,并且只有在出现错误时才将内容写入标准输出。

当我从终端运行命令时,我默认获得此功能。当我从 perl 脚本中运行命令时(``),它输出进度信息,但不输出任何错误消息。

我可以通过附加-s( --silent) 标志来隐藏进度信息,但我不能强制错误以直接从 bash 运行时的方式显示。-S( )标志--show-errors似乎没有效果。

我也尝试过将输出转移到 /etc/null,但这似乎根本阻止了任何内容的输出。

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

下面是我想要查找的错误类型的示例。这是由故意畸形的 IP 引起的:

{
    "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]."]
}

答案1

您需要区分curl 看到的错误和http 服务器返回的错误。后者不是curl 的错误。但是,您可以通过在curl中添加选项来轻松检查http状态代码

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

这会将 HTTP 标头附加到 stdout,即 200 表示 OK。所以你的 Perl 可以做类似的事情

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"; }

答案2

Perl 的反引号运算符将返回(到您的 $curl_result 变量)您运行的命令的 STDOUT。该命令中的 STDERR 将传递到调用程序/终端你的 Perl 脚本——也许在你的屏幕上,就像你curl自己调用的一样。

为了捕获 STDERR,您必须(正如您开始想象的那样)删除 STDOUT 或将两者混合。

下面是删除 STDOUT 并将 STDERR 重定向到 STDOUT 的示例,以便 perl 变量捕获它(而不是“正常”STDOUT):

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

或者,将两者混合:

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

我省略了批量命令的中间部分curl,以明确我更改了哪些部分。第一个示例将 STDERR 更改为指向 STDOUT 所在的位置现在指向,然后告诉 STDOUT 消失。第二个示例告诉 STDERR 指向 STDOUT,将两者混合在一起。

相关内容