zsh I/O 리디렉션: 먼저 리디렉션한 다음 파이프를 실행하세요.

zsh I/O 리디렉션: 먼저 리디렉션한 다음 파이프를 실행하세요.

누군가 이 명령에서 무슨 일이 일어나고 있는지 설명할 수 있습니까?

echo foo >&2 | grep foo

Zsh(5.0.2)는 foo두 번 인쇄합니다. 다음 명령을 실행한 이후 하나는 표준 출력으로 나타나고 다른 하나는 표준 오류로 나타납니다.

{ echo foo >&2 | grep foo } >/dev/null

그리고:

{ echo foo >&2 | grep foo } 2>/dev/null

둘 다 foo한 번만 인쇄됩니다.

답변1

이것이 효과다다수의.

echo foo >&2 | grep foo

foostderr 에 기록되고 foo으로 파이프됩니다 grep. stderr는 기본적으로 터미널에 연결되므로 각각 foo에서 하나, echo결과에서 하나, 두 줄이 표시됩니다 grep.

{ echo foo >&2 | grep foo } >/dev/null

stdout이 로 리디렉션되었기 때문에 여기에 줄이 표시됩니다 . 의 줄만 /dev/null표시됩니다 .fooecho

{ echo foo >&2 | grep foo } 2>/dev/null

여기서는 stderr이 로 리디렉션되었기 때문에 한 줄을 볼 수 있으며 , 의 줄만 /dev/null볼 수 있습니다 .foogrep

라인 출력 색상으로 터미널의 차이를 쉽게 알 수 있습니다. grep일치하는 패턴이 강조 표시됩니다(또는 강제로 사용할 수 있음 --color=always).


MULTIOS기본적으로 활성화되어 있지만 nomultios옵션이 설정되어 있지 않습니다.

$ unsetopt | grep nomultios
nomultios

비활성화하려면 nomultios다음 옵션을 설정하십시오.

$ setopt nomultios

관련 정보