(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
stdin의 두 가지 소스(파이프와 리디렉션)를 제공하므로 이를 처리하는 방법이 모호할 수 있습니다. zsh
두 개의 입력 스트림을 연결하는 것처럼 보이며 파이프된 입력이 일관되게 먼저 나옵니다. bash
단순히 파이프 입력을 삭제하는 것 같습니다.
내 질문은 다음과 같습니다
- 두 껍질이 다르게 동작하는 이유는 무엇입니까?
bash
처럼 행동하도록 강제할 수 있는 방법이 있나요zsh
?
답변1
당신이 알아차린 바와 같이,MULTIOS
쉘 옵션이것이 zsh
이것을 가능하게 하는 것입니다. 쉘 에는 유사한 내장 기능이 없습니다 bash
.
에서는 bash
동일한 동작을 얻게 됩니다(이 특정 예의 경우 참조).아래 Billy 삼촌의 의견) 에서
echo foo | { cat; cat bar; }
또는
echo foo | cat - bar
이 오른쪽 두 부분 모두 읽기 전에 먼저 표준 입력을 읽습니다 bar
.
답변2
나는 이것을 살펴보는데 좀 더 시간을 보냈고 의 동작 zsh
이MULTIOS
옵션, 이는 기본적으로 활성화되어 있습니다. bash
에는 비슷한 옵션이 없는 것 같으므로 이 동작은 에만 적용됩니다 zsh
.