我正在尝试编写一个命令,该命令可以同时(i)从标准输入读取和(ii)从管道读取。这个基本概念适用于zsh
,但不适用于bash
.以下会话说明了两个 shell 的行为差异:
$ 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
似乎只是删除管道输入。
我的问题是:
- 为什么两个 shell 的行为不同?
- 有什么办法可以强迫
bash
自己表现得像这样zsh
吗?
答案1
正如您所注意到的,MULTIOS
外壳选项正是zsh
这使得这一切成为可能。 shell中没有类似的内置设施bash
。
在 中bash
,您将得到相同的行为(对于这个特定示例;请参阅下面是比利叔叔的评论) 从
echo foo | { cat; cat bar; }
或者
echo foo | cat - bar
这两个右侧在读取之前首先读取其标准输入bar
。
答案2
我花了更多时间研究这个,我发现 的行为zsh
是由于MULTIOS
选项,默认情况下启用。 bash
似乎没有类似的选项,因此此行为特定于zsh
.