我想运行一个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,将两者混合在一起。