为什么未处理此管道中第一个命令的标准输出?

Kal*_*ert 3 bash zsh pipe

我正在尝试编写一个可以同时 (i) 从 stdin 读取和 (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
Run Code Online (Sandbox Code Playgroud)

我可以看到上面的命令提供了cat两个标准输入源(管道和重定向),所以也许应该如何处理它是不明确的。 zsh似乎连接了两个输入流,管道输入始终排在第一位。 bash似乎只是删除管道输入。

我的问题是:

  1. 为什么这两个壳的行为不同?
  2. 有没有办法强迫bash自己表现得像zsh

Kus*_*nda 5

正如你已经注意到,MULTIOSshell选项zsh是什么使这一切成为可能。bashshell 中没有类似的内置工具。

bash,你会得到相同的行为(对于这个特殊的例子,看看下面比利大叔的评论)从

echo foo | { cat; cat bar; }
Run Code Online (Sandbox Code Playgroud)

或者

echo foo | cat - bar
Run Code Online (Sandbox Code Playgroud)

这两个右手边在阅读之前首先阅读他们的标准输入bar