이 파이프의 첫 번째 명령에서 stdout이 처리되지 않는 이유는 무엇입니까?

이 파이프의 첫 번째 명령에서 stdout이 처리되지 않는 이유는 무엇입니까?

(i) stdin에서 읽고 (ii) 파이프에서 동시에 읽을 수 있는 명령을 작성하려고 합니다. 이 기본 개념은 에서는 작동 zsh하지만 에서는 작동하지 않습니다 bash. 다음 세션에서는 두 셸의 동작 차이를 보여줍니다.

$ echo bar > bar
$ zsh -f
zsh-5.8$ echo foo | cat < bar
foo
bar
zsh-5.8$ exit
$ bash --noprofile --norc
bash-5.0$ echo foo | cat < bar
bar

위의 명령은 catstdin의 두 가지 소스(파이프와 리디렉션)를 제공하므로 이를 처리하는 방법이 모호할 수 있습니다. zsh두 개의 입력 스트림을 연결하는 것처럼 보이며 파이프된 입력이 일관되게 먼저 나옵니다. bash단순히 파이프 입력을 삭제하는 것 같습니다.

내 질문은 다음과 같습니다

  1. 두 껍질이 다르게 동작하는 이유는 무엇입니까?
  2. bash처럼 행동하도록 강제할 수 있는 방법이 있나요 zsh?

답변1

당신이 알아차린 바와 같이,MULTIOS쉘 옵션이것이 zsh이것을 가능하게 하는 것입니다. 쉘 에는 유사한 내장 기능이 없습니다 bash.

에서는 bash동일한 동작을 얻게 됩니다(이 특정 예의 경우 참조).아래 Billy 삼촌의 의견) 에서

echo foo | { cat; cat bar; }

또는

echo foo | cat - bar

이 오른쪽 두 부분 모두 읽기 전에 먼저 표준 입력을 읽습니다 bar.

답변2

나는 이것을 살펴보는데 좀 더 시간을 보냈고 의 동작 zshMULTIOS옵션, 이는 기본적으로 활성화되어 있습니다. bash에는 비슷한 옵션이 없는 것 같으므로 이 동작은 에만 적용됩니다 zsh.

관련 정보