(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
파이프 입력을 제거하는 것 같습니다.
내 질문은 다음과 같습니다
- 두 껍질이 다르게 동작하는 이유는 무엇입니까?
bash
내가 이렇게 행동하도록 강요할 수 있는 방법이 있나요zsh
?
답변1
눈치채셨듯이,MULTIOS
주택 옵션이것이 zsh
이것을 가능하게 하는 것입니다. 쉘에는 유사한 내장 기능이 없습니다 bash
.
에서는 bash
동일한 동작을 수행하게 됩니다(이 특정 예의 경우 참조).Billy 삼촌의 의견은 다음과 같습니다.) 에서
echo foo | { cat; cat bar; }
또는
echo foo | cat - bar
두 개의 오른쪽은 읽기 전에 먼저 표준 입력을 읽습니다 bar
.
답변2
나는 이것을 조사하는 데 더 많은 시간을 보냈고 내가 발견한 동작은 zsh
다음과 같습니다.MULTIOS
옵션, 기본적으로 활성화되어 있습니다. bash
유사한 옵션이 없는 것 같으므로 이 동작은 에만 적용됩니다 zsh
.