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

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

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

예를 들어,이 줄에서 :

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

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

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



답변

( 파일에 &>>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


답변

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

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

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


답변