Debianのカール出力制御

Debianのカール出力制御

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つを一緒に混合する。

関連情報