为什么这个管道中第一个命令的标准输出没有被处理?

为什么这个管道中第一个命令的标准输出没有被处理?

我正在尝试编写一个命令,该命令可以同时(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似乎只是删除管道输入。

我的问题是:

  1. 为什么两个 shell 的行为不同?
  2. 有什么办法可以强迫bash自己表现得像这样zsh吗?

答案1

正如您所注意到的,MULTIOS外壳选项正是zsh这使得这一切成为可能。 shell中没有类似的内置设施bash

在 中bash,您将得到相同的行为(对于这个特定示例;请参阅下面是比利叔叔的评论) 从

echo foo | { cat; cat bar; }

或者

echo foo | cat - bar

这两个右侧在读取之前首先读取其标准输入bar

答案2

我花了更多时间研究这个,我发现 的行为zsh是由于MULTIOS选项,默认情况下启用。 bash似乎没有类似的选项,因此此行为特定于zsh.

相关内容