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"; }
答え2
Perlのバックティック演算子は、実行したコマンドのSTDOUTを($curl_result変数として)返します。コマンドのSTDERRは呼び出し側プログラム/ターミナルに渡されます。~のPerlスクリプト - たぶん画面にcurl
表示されることがあります。
STDERRをキャプチャするには(想像し始めたように)STDOUTを削除するか、2つを混在させる必要があります。
以下は、STDOUTを削除してSTDERRをSTDOUTにリダイレクトしてPerl変数にそれをキャプチャさせる例です(「標準」STDOUTの代わりに)。
my $curl_result = `curl ... 2>&1 1>/dev/null`;
または2つを混ぜます。
my $curl_result = `curl ... 2>&1`;
curl
どの部分を変更したかを明確にするために、バッチコマンドの中間部分を省略しました。最初の例では、STDERRを変更してSTDOUTがある場所を指しています。今ポイントし、STDOUTに消えるように指示します。第2の例では、STDERRにSTDOUTを指すように指示し、2つを一緒に混合する。