배관 STDERR 대 STDOUT


24

" Linux : Complete Reference 6th Edition "(44 페이지)에 따르면 리디렉션 기호를 사용하여 STDERR 파이프 할 수 있습니다 |&.

이것을 테스트하기 위해 매우 간단한 스크립트를 작성했습니다.

#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2

이 스크립트를 다음과 같이 실행합니다.

./script.sh |& sed 's:^:\t:'

아마도 STDERR에 인쇄 된 줄만 들여 쓰기됩니다. 그러나, 실제로는 다음과 같이 작동하지 않습니다.

    Normal Text.
    Error Text. 

내가 여기서 뭘 잘못하고 있니?

답변:


26

책에서 어떤 텍스트를 사용하는지 모르지만 bash 설명서 가 명확합니다 (이미 리디렉션에 익숙한 경우).

|&이 명령을 사용 하면 표준 출력 외에도 command1의 표준 오류가 파이프를 통해 command2의 표준 입력에 연결됩니다. 에 대한 속기입니다 2>&1 |. 표준 오류를 표준 출력으로 암시 적으로 재지 정하는 것은 명령에 의해 지정된 재 지정 후에 수행됩니다.

따라서 표준 출력과 표준 오류를 혼합하지 않으려면 표준 출력을 다른 곳으로 리디렉션해야합니다. 표준 오류 스트림을 잡는 방법 (stderr)을 참조하십시오 .

{ ./script.sh 2>&1 >&3 | sed 's:^:\t:'; } 3>&1

둘 다 1과 3을 전략 중 script.sh하고 sed있지만 원래의 표준 출력 대상을 가리 킵니다. 좋은 시민이되고 싶다면, 명령이 필요없는 fd 3을 닫을 수 있습니다 :

{ ./script.sh 2>&1 >&3 3>&- | sed 's:^:\t:' 3>&-; } 3>&1

bashksh93축소 할 수 있습니다 >&3 3>&->&3-(FD 이동).


bash 매뉴얼은 완전히 명확하지 않습니다. 떨어지게처럼 왜 나는 확실히 이해하지 못하는 ./script.sh > /tmp/stdout_goes_here |& grep 'grepping_script_stderr'일을하지 않는 의도 한대로, 예 : 리디렉션 script.shstdout(먼저 발생해야 수동 조각에 따라하는), 다음 있도록 grep스크립트의 처리를 위해 stderr. 대신 stderrtdout`은 결국stdout_goes_here
sxc731

1
@ sxc731의 |&줄임말입니다 2>&1 |. 따라서 >/tmp/stdout_goes_here |&stdout을 /tmp/stdout_goes_here2>&1리디렉션 한 다음 stdout이 가고있는 곳으로 stderr를 리디렉션 /tmp/stdout_goes_here하고 마지막으로 |명령의 출력이 리디렉션되어 입력을받지 못합니다. 있다는 사실을 양지 >&1로 리디렉션 파일 기술자 1은 현재 예정이다 어디든지 하지 않도록, 파일 기술자 1 가고 끝날 때마다 . stderr 만 파이프하고 stdout을 파일로 리디렉션하려면 한 가지 방법이 2>&1 >/tmp/stdout_goes_here |있습니다.
Gilles 'SO- 악마 그만

6

|&파이프 stderr를 stdin에 연결 2>&1 |하므로 다음 프로그램은 stdin에 둘 다 표시됩니다.

$cat test.sh
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
$./test.sh | sed 's:^:\t:'
Error Text.
        Normal Text.
$ ./test.sh |& sed 's:^:\t:'
        Normal Text.
        Error Text.

아, 그래서 그것은 기본적으로 더 긴 표현과 동일 runcommand 2>&1 | tee합니까? 즉 runcommand |& tee?
Naftuli Kay

예, 동일합니다.
케빈

1

|&bash에서는 (가끔 이식성이없는) 바로 가기 2>&1 |이므로 모든 줄을 들여 쓰기해야합니다.

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