배쉬 매뉴얼에서https://www.gnu.org/software/bash/manual/html_node/Pipelines.html 그것은 다음과 같이 말합니다:
|&
' '를 사용 하면 의 표준 오류가command1
표준 출력 외에command2
표준 입력으로 파이프 됩니다2>&1 |
.
커뮤니티에 대한 나의 질문은 그것이 실제로 무엇을 의미하는지입니다. 왜 아무것도 하지 않는다고 생각하는지 보여주기 위해 테스트를 했습니다.
여기서는 작동하는 루프를 만들었고 마지막 줄에 오류가 발생했습니다.
items="frog cat"
for item in $items
do
echo $item
done
for item i will make error this line
따라서 매뉴얼에서 암시하는 바는 |&를 사용하지 않는 한 stderr은 다음 명령으로 파이프되기 때문에 stdout으로 출력되지 않는다는 것입니다. 그래서 테스트해봤습니다:
## this shows a regular pipe without &. As you can see stderr gets written anyway
$ ./testing.sh | grep error
./testing.sh: line 7: syntax error near unexpected token `i'
./testing.sh: line 7: `for item i will make error this line'
## this shows a pipe with |& in it.
$ ./testing.sh |& grep error
./testing.sh: line 7: syntax error near unexpected token `i'
./testing.sh: line 7: `for item i will make error this line'
예, stderror는 어쨌든 다음 파이프 명령에 기록됩니다 &|
. 그렇다면 그 요점은 무엇입니까 |&
?
답변1
stderr은 "어쨌든 다음 파이프 명령에 쓰기"가 아니며 기본적으로 터미널에 들어가는 stderr에 기록됩니다.
Bash 참조 매뉴얼은 다음과 같이 말합니다:
의 약자입니다
2>&1 |
. 표준 오류를 표준 출력으로 암시적으로 리디렉션하는 것은 command1에 의해 지정된 리디렉션 후에 수행됩니다.
이는 stderr이 파이프를 통해 전송되기 전에 stdout으로 리디렉션된다는 의미입니다.
$ cat stderr.sh
#!/usr/bin/env bash
echo 'This is an error' >&2
echo 'This is not'
이를 실행하면 stdout 및 stderr에 출력이 표시됩니다.
$ ./stderr.sh
This is an error # This is displayed on stderr
This is not # this is displayed on stdout
stdout을 리디렉션하면 /dev/null
stderr만 표시됩니다.
$ ./stderr.sh >/dev/null
This is an error
마찬가지로 stderr를 stdout으로 리디렉션하면 /dev/null
다음만 표시됩니다.
$ ./stderr.sh 2>/dev/null
This is not
여기서는 이 sed 명령을 사용하여 파이프를 통과하는 방법을 더 자세히 설명할 수 있습니다.
$ ./stderr.sh | sed 's/^/Via the pipe: /'
This is an error
Via the pipe: This is not
$ ./stderr.sh |& sed 's/^/Via the pipe: /'
Via the pipe: This is an error
Via the pipe: This is not
첫 번째 예에서는 오류가 Via the pipe:
파이프를 통해 이동하지 않기 때문에 오류 앞에 붙지 않습니다. 이는 두 번째 예에서도 마찬가지입니다.