이 파이프라인에서 첫 번째 명령의 표준 출력이 처리되지 않는 이유는 무엇입니까?

이 파이프라인에서 첫 번째 명령의 표준 출력이 처리되지 않는 이유는 무엇입니까?

(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

위의 명령은 cat표준 입력의 두 가지 소스(파이프 및 리디렉션)를 제공하므로 이를 처리하는 방법이 불분명할 수 있습니다. zsh두 개의 입력 스트림이 연결되어 있고 파이프 입력이 항상 먼저 오는 것 같습니다. bash파이프 입력을 제거하는 것 같습니다.

내 질문은 다음과 같습니다

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

답변1

눈치채셨듯이,MULTIOS주택 옵션이것이 zsh이것을 가능하게 하는 것입니다. 쉘에는 유사한 내장 기능이 없습니다 bash.

에서는 bash동일한 동작을 수행하게 됩니다(이 특정 예의 경우 참조).Billy 삼촌의 의견은 다음과 같습니다.) 에서

echo foo | { cat; cat bar; }

또는

echo foo | cat - bar

두 개의 오른쪽은 읽기 전에 먼저 표준 입력을 읽습니다 bar.

답변2

나는 이것을 조사하는 데 더 많은 시간을 보냈고 내가 발견한 동작은 zsh다음과 같습니다.MULTIOS옵션, 기본적으로 활성화되어 있습니다. bash유사한 옵션이 없는 것 같으므로 이 동작은 에만 적용됩니다 zsh.

관련 정보