bash에서 stdout과 stderr을 모두 파이프합니까?


156

최신 버전의 bash에는 &>연산자 가 있습니다.이 연산자는 (정확히 이해하면) stdout과 stderr을 파일로 리디렉션합니다 ( &>>Adrian이 명시한대로 파일에 추가).

같은 것을 달성하는 대신 가장 다른 방법으로 다른 명령으로 파이핑하는 방법은 무엇입니까?

예를 들어,이 줄에서 :

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

grep을 stdout 및 stderr의 내용과 일치시키고 싶습니다 (효과적으로 하나의 스트림으로 결합).

참고 :이 질문은 리디렉션 하지 않고 파이핑 에 대해 질문하므로 현재 중복으로 표시된 질문과 중복되지 않습니다.


stdout과 stderr을 모두 파이프하는 올바른 방법은 링크 된 질문에 대한 두 번째 답변 ( stackoverflow.com/a/637834/1129642 )을 참조하십시오 . 다른 질문이 필요 없습니다.
Marki555

4
@triplee 정확히 중복되지 않습니까? 파이프 대 파일로 리디렉션?
Benjamin W.

@ BenjaminW 두 가지 시나리오를 모두 해결하는 대답이 적어도 하나는 있지만 받아 들일만한 대답은 아닙니다. 이것은 매우 일반적인 질문이므로 더 나은 복제본을 찾거나 중재자에게 이들을 병합하도록 요청할 수 있습니다. 최악의 경우에는이 주제에 대해 완전히 새로운 정식을 만들 수 있습니다. 더 나은 속임수를 찾으면 꼭 제안하십시오. 미리 감사드립니다.
tripleee

12
@tripleee 해결하지만, 대답 중 어느 것도 |&바로 가기를 사용하지 않습니다. "stdout과 stderr을 파이프로 리디렉션"하는 가장 편리한 솔루션이라고 생각합니다.
Benjamin W.

3
이것은 연결된 질문의 사본이 아니며 Marko의 답변이 내가 원하는 것을했는지 확실하지 않았습니다. 또한 | &는 언급되지 않습니다. 재개 투표.
Martin Bonner는 Monica

답변:


163

( 파일에 &>>file 추가 하는 동안 기존 파일을 &>리디렉션하고 덮어 쓰게 됩니다.)

결합 stdout하고 stderr당신은 사용 이전에 후자를 리디렉션 할 것이다 2>&1. 그러면 stderr (파일 설명자 2)가 stdout (파일 설명자 1)으로 리디렉션됩니다. 예 :

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdoutstdout에 stderr가서 stderr에갑니다. grep만 보이 stdout므로 stderr터미널로 인쇄합니다.

반면에 :

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

stdout과 stderr에 모두 쓴 후 2>&1stderr을 stdout으로 다시 리디렉션 grep하고 stdin에서 두 문자열을 모두보고 두 필터를 모두 걸러냅니다.

리디렉션에 대한 자세한 내용은 여기를 참조 하십시오 .

귀하의 예 (POSIX)와 관련하여 :

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

또는 다음을 사용하십시오 >=bash-4.

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

에 대한 설명을 보내 주셔서 감사합니다 &>>. 내 질문을 수정했습니다.
Andrew Ferrier 13:11에

18
주어진 예제를 기반으로 명확하지 않은 경우를 대비하여 귀하의 예를 답변에 추가했습니다. 참고로 |&대신 bash 전용을 사용할 수도 있습니다 2>&1 |.
Adrian Frühwirth

13
|&향후 독자를 위해 @ AdrianFrühwirth에서 제안한 바로 가기에 대한 참고 사항 :이 기능은 bash버전 4 이상 에서만 지원됩니다 . 3 이하를 사용하는 경우를 사용해야합니다 2>&1 |.
tomocafe

3
배시 리디렉션은 여기에 잘 설명되어 있습니다 . @ AdrianFrühwirth는 훌륭한 일을 해냈으며, 붙여 낸 링크는 더욱 발전했습니다. 때로는 공식 Bash 문서가 그렇게 좋기를 바랍니다.
David Andreoletti

112

Bash는 2>&1 |, 즉 |&stdout과 stderr을 모두 파이프 하는 축약 형입니다 ( 설명서 참조 ).

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

이것은 Bash 4.0에서 도입되었습니다 . 릴리스 노트를 참조하십시오 .


완전성을 위해 이것을 추가해 주셔서 감사합니다. 많은 사람들이 여전히 4.0 이전의 bash를 사용하고 있기 때문에 다른 대답을 올바르게 유지할 것입니다. 그러나 이것은 유용합니다.
Andrew Ferrier

9
가장 주목할만한 점은 macOS에 제공되는 Bash가이를 지원하기에는 너무 오래된 것입니다.
Flimm

@Flimm 그러나 zsh는 그렇지 않습니다
Trenton

1
ksh는 coproc에 | &를 사용하기 때문에 불필요한 속기에는 좋지 않은 선택 인 것 같습니다. 나는 다음 사람만큼 많은 바보와 방향 전환이있는 줄을보고 싶지 않지만 명시 적이라고 할 말이 있습니다 ... 나는 사람들이 이것을 보는 것이 좋기 때문에 실제로 도움이되는 대답을 내리지 않고 속기의 불쾌감을 표현하고 싶었습니다. 나는 이것을 몰랐다. 그래서 나를 알게 해줘서 고마워.
Paul Hodges 17.

@PaulHodges 나는 그것이 휴대용이 아니라는 것에 동의합니다-나는 너무 많이 입력하지 않도록 대화 형 Bash 세션에 주로 사용하는 것을 좋아합니다.
Benjamin W.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.