curl -v의 출력을 어떻게 파이프하거나 리디렉션합니까?


117

어떤 이유로 2> 또는> 또는 |를 통해 리디렉션하는지 여부에 관계없이 출력은 항상 터미널에 인쇄됩니다. 이 문제를 해결할 방법이 있습니까? 왜 이런 일이 발생합니까?


3
그렇게 curl -v url 2>&1하면 오류가 나를 위해 표준 출력으로 올바르게 리디렉션됩니다.
조쉬 리

답변:


134

-s(silent) 옵션을 추가하여 진행률 표시기를 제거한 다음 stderr을 stdout으로 리디렉션하여 응답 본문과 동일한 fd에서 자세한 출력을 얻습니다.

curl -vs google.com 2>&1 | less

3
이것은 대부분의 웹 사이트에서 작동하지만 어떤 이유로 내 컴퓨터의 로컬 서버는`2> & 1 | grep asdfasdfasdfasdfdfs` 또는 그런 것. 헤더를 포함한 전체 출력은 여전히 ​​콘솔에 표시됩니다. 필요한 데이터를 추출하기 위해 grep으로 파이프 할 수있는 다른 스트림이 있습니까?
jonderry 2011 년

실제로 추출하려는 정보는 무엇이며 버리고 싶은 정보는 무엇입니까? 귀하의 질문은 -v의 모든 출력이 stdout으로 향하기를 원한다는 것을 의미합니다.
SingleNegationElimination 2011 년

일부 쿠키를 처리하고 싶습니다 (기본적으로 쿠키에서 일부 정보를 grep하고 다른 작업을 수행합니다). 예, 모든 것이 표준 출력되기를 원하므로 파이프를 통해 원하는 것을 처리 할 수 ​​있습니다. 현재 일부 출력은 콘솔에 표시되며 리디렉션이 불가능한 것 같습니다. 이유를 모르겠습니다.
jonderry 2011 년

캡처하려는 화면에 나타나는 출력의 스크린 샷을 게시 할 수 있습니까? 에서 놓칠 수있는 어떤 종류의 출력을 볼 수 있는지 모르겠습니다 2>&1.
SingleNegationElimination 2011 년

다른 웹 사이트와 동일한 출력 유형입니다. 유일한 차이점은 서버가 로컬로 실행된다는 것입니다. 어떤 프로그램이 콘솔에 인쇄 할 수 있지만 해당 텍스트가 stout / sterr에 의해 캡처되지 않도록하는 방법이 있습니까?
jonderry 2011 년

115

URL에 앰퍼샌드가있을 수 있습니다. 나도이 문제가 있었고 내 URL이 앰퍼샌드 (CGI 변수가 전달됨)로 가득 차서 모든 것이 이상한 방식으로 백그라운드로 전송되어 제대로 리디렉션되지 않는다는 것을 깨달았습니다. URL을 따옴표로 묶으면 문제가 해결됩니다.


1
나는 같은 문제가 있었다. 2> & 1은 필요하지 않으므로 출력과 연결 로그를 별도로 보관할 수 있습니다. 감사합니다 roadnottaken.
quornian

3
Love Stack-O ...이 q와 URL에서 앰퍼샌드에 대한 언급을 찾았습니다. 내 주변에 따옴표를 붙이고 문제가 해결되었습니다.
Paulb 2014

2
따옴표가 나를 위해 트릭을했습니다. 컬이 다른 스레드에서 실행되는 것처럼 느꼈습니다. 고마워요!
vdolez

1
당신이 내 저녁 : 저장하기 전에 5 분 동안 웹에서 검색 할 수 있었다
Shautieh

예수님,이 얼마나 끔찍한 벌레입니까? 최소한 실패하거나 경고해야합니다. 귀하의 2012 년 답변은 2018 년에 저를 도왔습니다. 답변을 찾을 때까지이 문제를 해결하는 데 30 분이 걸렸습니다. 감사합니다!
Mauvis Ledford

29

위의 대답은 나를 위해 작동하지 않았으며 결국 다음 구문이되었습니다.

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee는 화면에 출력을 표시하지만 내 로그에도 추가합니다.


1
&> /dev/stdout이었다 확실히 누락 된 부분, 감사
mattspain

10

파일에 출력이 필요한 경우 리디렉션을 사용할 수 있습니다.

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

플립하지 않도록주의하시기 바랍니다 >curl-output.txt2>&1,하는 것입니다 인해하지 작업 배쉬의 재 동작 .


3

나는 똑같은 것을 발견했다. curl 자체는 STDOUT에 인쇄되지만 다른 프로그램으로 파이프 될 수는 없다.

처음에는 xargs를 사용하여 출력을 먼저 에코하여 해결했다고 생각했습니다.

curl -s ... <url> | xargs -0 echo | ...

그러나 주석에서 지적했듯이 xargs 부분 없이도 작동하므로 -s(자동 모드)는 STDOUT에 대한 불필요한 진행 출력을 방지하는 열쇠입니다.

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

위의 예는 <sometag>curl 문의 XML 출력에서 간단한 콘텐츠 (포함 된 태그가 포함되지 않음)를 가져옵니다.


2
귀하의 예에서 'xargs -0 echo |' 불필요합니다. 'curl -s'가있는 한 출력을 다른 프로그램으로 파이프 할 수 있습니다.
Ryan Horrisberger 2013

1

내 2 센트. 아래 명령은 앞서 답변 한대로 트릭을 수행해야합니다.

curl -vs google.com 2>&1

그러나 출력을 파일로 가져와야하는 경우

curl -vs google.com > out.txt 2>&1

작동합니다.


1
이것은 2011 년에 받아 들여진 대답에 실질적인 가치를 더하지 않습니다. 만약 있다면 이것은 그 대답에 대한 코멘트 일 수 있습니다.
trincot

0

다음은 나를 위해 일했습니다.

curl 문을 다음과 같은 스크립트에 넣으십시오. abc.sh

이제 실행 :

sh abc.sh 1>stdout_output 2>stderr_output

컬의 결과 stdout_output와 진행 정보를 stderr_output.


0

이 간단한 예제는 curl 출력을 캡처하고 bash 스크립트에서 사용하는 방법을 보여줍니다.

test.sh

function main
{
  \curl -vs 'http://google.com'  2>&1
  # note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file. 
}

# capture output of curl to a variable
OUT=$(main)

# search output for something using grep.
echo
echo "$OUT" | grep 302 
echo
echo "$OUT" | grep title 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.