에 따르면"Linux: 완전한 참고서 6판"(44페이지), 파이프할 수 있습니다.오직STDERR은 |&
리디렉션 기호를 사용합니다.
나는 이것을 테스트하기 위해 매우 간단한 스크립트를 작성했습니다.
#!/bin/bash
echo "Normal Text."
echo "Error Text." >&2
이 스크립트를 다음과 같이 실행합니다.
./script.sh |& sed 's:^:\t:'
아마도 STDERR로 인쇄된 행만 들여쓰기될 것입니다. 그러나 내가 볼 때 실제로는 다음과 같이 작동하지 않습니다.
Normal Text.
Error Text.
내가 여기서 뭘 잘못하고 있는 걸까?
답변1
책에 어떤 텍스트를 사용했는지는 모르겠지만,배쉬 매뉴얼매우 명확합니다(리디렉션에 이미 어느 정도 익숙한 경우).
사용되는 경우
|&
command1의 표준 오류는 표준 출력 외에 command2의 표준 입력으로 파이프됩니다2>&1 |
. 표준 오류를 표준 출력으로 암시적으로 리디렉션하는 것은 명령에 의해 지정된 리디렉션 후에 수행됩니다.
따라서 표준 출력과 표준 오류를 혼합하고 싶지 않다면 표준 출력을 다른 곳으로 리디렉션해야 합니다. 바라보다표준 오류 스트림(stderr)을 어떻게 grep합니까?
{ ./script.sh 2>&1 >&3 | sed 's:^:\t:'; } 3>&1
script.sh
그러나 fds 1과 3은 sed
모두 원래 stdout 대상을 가리킵니다. 훌륭한 시민이 되고 싶다면 해당 명령에서 필요하지 않은 fd 3을 끌 수 있습니다:
{ ./script.sh 2>&1 >&3 3>&- | sed 's:^:\t:' 3>&-; } 3>&1
bash
그리고 (fd move) 로 ksh93
압축될 수 있습니다 .>&3 3>&-
>&3-
답변2
|&
예를 들어 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.
답변3
|&
Bash에서는 단지 (이식성이 떨어지는) 단축키 2>&1 |
이므로 모든 줄이 들여쓰기되어 있어야 합니다.