![Bash가 stdout을 stderr로 두 번 리디렉션할 때 두 줄(`>&2` 및 `>/dev/stderr`)을 인쇄하는 이유는 무엇입니까?](https://linux55.com/image/220612/Bash%EA%B0%80%20stdout%EC%9D%84%20stderr%EB%A1%9C%20%EB%91%90%20%EB%B2%88%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%A0%20%EB%95%8C%20%EB%91%90%20%EC%A4%84(%60%26gt%3B%26amp%3B2%60%20%EB%B0%8F%20%60%26gt%3B%2Fdev%2Fstderr%60)%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음 출력 리디렉션으로 인해 두 줄이 인쇄되는 이유는 무엇입니까?
>&2
stdout을 stderr로 복사 하고 >/dev/stderr
stdout을 stderr로 리디렉션합니다.
echo foo
출력이 stderr로 리디렉션되므로 출력 라인이 하나만 예상됩니다 .
echo foo >/dev/stderr 2>&1
: 및 에 대한 두 개의 출력 라인이 표시되지 않는 이유는 무엇입니까 echo foo >/dev/stdout 2>&1
?
➜ app git:(python3.10-pipeline) ✗ echo foo >/dev/stderr >&2
foo
foo
➜ app git:(python3.10-pipeline) ✗ echo foo >/dev/stdout >&2
foo
foo
답변1
셸 에서 bash
동일한 스트림을 두 번 리디렉션하면 스트림 내용이 다음으로 리디렉션됩니다.마지막(맨 오른쪽) 목적지. 실제로, bash
표시된 명령을 쉘에 입력하면 각 명령은 표준 오류 스트림에서 한 줄의 출력만 생성합니다.
그러나 zsh
대신 쉘을 사용하고 있습니다 bash
. zsh
쉘에서 기본적으로 쉘은 동일한 스트림의 여러 리디렉션을 다음과 같이 처리합니다.복사tee
그 스트림은 누군가가 사용한 것처럼 보였습니다 .
이것은 의미한다
echo hello >/dev/stderr >&2
또는
echo hello >file1 >file2 >file3
표준 출력을 두 번 리디렉션하고 트리 시간을 각각 리디렉션하면 다음과 같은 방식으로 표준 출력 스트림이 복사됩니다.
echo hello | tee /dev/stderr >&2
또는
echo hello | tee file1 file2 >file3
할 것입니다.
MULTIOS
셸에서 셸 옵션( )을 선택 취소하여 unsetopt MULTIOS
이 동작을 비활성화 할 수 있습니다 .