cURL : 리디렉션 할 때 이상한 출력을 억제하는 방법은 무엇입니까?


66

stderrbash 셸에서 cURL 요청의 자세한 섹션 만 인쇄하려고합니다 .

그러나 내가 이렇게 리디렉션 stdout하면 :

curl -v http://somehost/somepage > /dev/null

출력 중간에 다음과 같은 결과 테이블이 나타납니다 stderr.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

끝 부분에 이것에 의해 다음과 같이 :

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

응답 헤더를 읽기 어렵게 만듭니다.

리디렉션하지 않으면이 텍스트가 표시되지 않습니다.


효과를 보는 또 다른 방법 :

표가 나타나지 않습니다 :

curl -v http://somehost/somepage 2>&1

표가 나타납니다.

curl -v http://somehost/somepage 2>&1 | cat

1) 특정 유형의 리디렉션에서만 어떻게 표시됩니까?

2) 그것을 억제하는 가장 쉬운 방법은 무엇입니까?

감사합니다

답변:


59

이 시도:

curl -vs -o /dev/null http://somehost/somepage 2>&1

즉, 진행을 억제 m 보낼 stdout/dev/null리다이렉트 stderr( -v에 출력) stdout.


32
감사합니다, -s열쇠였습니다!
Ian Mackinnon

6
@IanMackinnon 유무에 -s관계없이 -v연결 실패와 같은 오류는 표시되지 않습니다. 이를 위해 mhoydis의 답변과 같이 -S(또는 --show-error)을 추가해야합니다 .
Artyom

하지만 리디렉션 할 때 진행률 표시 줄이 처음에만 나타나는 이유 는 무엇입니까? 의 출력을 파이핑 할 때 동일한 문제가 발생 curl했습니다 jq. 에 파이핑없이 진행률 표시 줄이 없으면 파이핑 할 jqjq돌아가서 추가해야 -s합니다.
sixty4bit

@ sixty4bit : 개발자가 선택한 디자인 선택입니다. 프로그램은 STDOUTtty가 아닌 경우를 감지 할 수 있습니다 . 출력이 파이프되지 않을 때 진행 정보가 일반 출력에 산재되는 것을 원하지 않으므로 진행 상황을보고 이해할 수 있습니다. 출력이 리디렉션되거나 파이프 될 때 진행률 표시 줄이 켜지지 않으면 출력을 볼 수 없으므로 진행 상태가 표시되지 않습니다.
데니스 윌리엄슨

22
curl --fail --silent --show-error http://www.example.com/ > /dev/null

상태 대화 상자가 표시되지 않지만 STDERR에 오류가 출력됩니다.

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

위는 리디렉션 할 때 상태 테이블을 출력합니다.

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

위의 경우 리디렉션 할 때 상태 테이블이 표시되지 않지만 오류는 여전히 STDERR로 이동합니다.

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

위는 STDERR 오류의 예입니다.

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

STDERR을 STDOUT (이 경우 파일)으로 리디렉션하려면 끝에 2> & 1을 추가하십시오.


5

에 따르면 man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

사용법 예 :

curl -s 'http://www.google.com'

또는 bash의 변수에 HTTP-BODY를 캡처하려는 경우

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

사용 -s하거나 --silent상호 교환 할 수 있습니다 .


4

질문 1 ( 출력이 리디렉션 될 때만 cURL이 테이블을 표시하는 방법을 알고 있음)을 참조 하면 프로그램이 출력이 지시되고 있음을 알 수는 없지만 POSIX 시스템에는 isatty여부를보고 하는 기능이있는 것 같습니다 파일 디스크립터는 터미널을 나타냅니다.


2
Bash 스 니펫은 다음과 같습니다.[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson

2

1) 특정 유형의 리디렉션에서만 어떻게 표시됩니까?

컬 맨 페이지에서

HTTP POST 또는 PUT 요청에 대한 진행률 미터를 원하는 경우 쉘 경로 재 지정 (>), -o [file] 또는 유사 항목을 사용하여 응답 출력을 파일로 경로 재지 정해야합니다.

curl은 isatty 를 사용하여 경로 재 지정을 판별하고 파일 또는 쉘 파이프로 경로 재 지정 될 때 진행 미터를 인쇄 해야합니다 .

2) 그것을 억제하는 가장 쉬운 방법은 무엇입니까?

컬 맨 페이지에서

-s,-자동

자동 또는 자동 모드. 진행률 표시기 또는 오류 메시지를 표시하지 마십시오. 컬을 음소거합니다. 요청한 데이터는 리디렉션하지 않으면 터미널 / stdout으로 출력됩니다.


1

실제 오류 메시지를 저장하려면 strerr를 로그 파일에 작성해야합니다. 그런 것 :

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.