Debian에서 컬 출력 제어

Debian에서 컬 출력 제어

컬 명령을 실행하고 오류가 발생한 경우에만 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을 제거하거나 두 가지를 혼합해야 합니다.

다음은 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을 가리키도록 지시하여 두 가지를 함께 혼합합니다.

관련 정보