배관 STDERR 대 STDOUT Text.” >&2 이 스크립트를 다음과 같이 실행합니다. ./script.sh |&

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. 

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



답변

책에서 어떤 텍스트를 사용하는지 모르지만 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 이동).


답변

|&파이프 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.

답변

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