[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
$
stdout
stdout에 stderr
가서 stderr에갑니다. grep
만 보이 stdout
므로 stderr
터미널로 인쇄합니다.
반면에 :
$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$
stdout과 stderr에 모두 쓴 후 2>&1
stderr을 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