curlコマンドを実行し、エラーが発生した場合にのみstdoutにコンテンツを書きたいと思います。
端末でコマンドを実行するときは、デフォルトでこの機能を使用します。 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
カールに表示されるエラーとhttpサーバーから返されたエラーとを区別する必要があります。後者はカールのせいではありません。ただし、カールにオプションを追加すると、簡単にhttpステータスコードを確認できます。
-w '\n%{http_code}\n'
これにより、stdoutにHTTPヘッダーが追加されます。これはOKの場合は200です。だからあなたの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"; }