Bash가 stdout을 stderr로 두 번 리디렉션할 때 두 줄(`>&2` 및 `>/dev/stderr`)을 인쇄하는 이유는 무엇입니까?

Bash가 stdout을 stderr로 두 번 리디렉션할 때 두 줄(`>&2` 및 `>/dev/stderr`)을 인쇄하는 이유는 무엇입니까?

다음 출력 리디렉션으로 인해 두 줄이 인쇄되는 이유는 무엇입니까?

>&2stdout을 stderr로 복사 하고 >/dev/stderrstdout을 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이 동작을 비활성화 할 수 있습니다 .

관련 정보