Debian

在 Debian 上控制 curl 輸出

  • April 16, 2018

我想執行一個 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]."]
}

您需要區分 curl 看到的錯誤和 http 伺服器返回的錯誤。後者不是 curl 的錯誤。但是,您可以通過將選項添加到 curl 來輕鬆檢查 http 狀態程式碼

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

這會將 HTTP 標頭附加到標準輸出,即 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"; }

引用自:https://unix.stackexchange.com/questions/437925