我正在尝试编写一个可以同时 (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似乎只是删除管道输入。
我的问题是:
bash自己表现得像zsh?正如你已经注意到,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。