” 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
bash
및 ksh93
축소 할 수 있습니다 >&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 |
이므로 모든 줄을 들여 쓰기해야합니다.