このパイプラインで最初のコマンドの標準出力が処理されないのはなぜですか?

このパイプラインで最初のコマンドの標準出力が処理されないのはなぜですか?

(i)stdinから読み込み、(ii)パイプから同時に読み取ることができるコマンドを作成しようとしています。この基本概念は適用されますが、zsh適用されませんbash。次のセッションは、2つのシェル間の動作の違いを示しています。

$ 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標準入力の2つのソース(パイプとリダイレクト)を提供するため、これを処理する方法は不明です。 zsh2つの入力ストリームが接続され、パイプ入力が常に最初に来るようです。 bashパイプ入力を取り除くようです。

私の質問は次のとおりです

  1. 2つの殻が異なる動作をするのはなぜですか?
  2. bash私がこのように振る舞うように強制する方法はありますかzsh

答え1

気づいたように、MULTIOS住宅オプションこれがzshこれを可能にすることです。シェルには同様の組み込み機能はありませんbash

ではbash同じ動作を行います(この特定の例の場合を参照)。ビリーおじさんのコメントは次のとおりです。)から

echo foo | { cat; cat bar; }

または

echo foo | cat - bar

2つの右側は、読み取る前に最初に標準入力を読みますbar

答え2

私はこれを調べるのにもっと時間を費やしました、そして私が見つけたアクションはzsh次のとおりです。MULTIOSオプション、デフォルトで有効になっています。 bash同様のオプションがないように見えるため、この動作はのみ適用されますzsh

関連情報