다음 출력 리디렉션으로 인해 두 줄이 인쇄되는 이유는 무엇입니까?
>&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
이 동작을 비활성화 할 수 있습니다 .