(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つのソース(パイプとリダイレクト)を提供するため、これを処理する方法は不明です。 zsh
2つの入力ストリームが接続され、パイプ入力が常に最初に来るようです。 bash
パイプ入力を取り除くようです。
私の質問は次のとおりです
- 2つの殻が異なる動作をするのはなぜですか?
bash
私がこのように振る舞うように強制する方法はありますかzsh
?
答え1
気づいたように、MULTIOS
住宅オプションこれがzsh
これを可能にすることです。シェルには同様の組み込み機能はありませんbash
。
ではbash
同じ動作を行います(この特定の例の場合を参照)。ビリーおじさんのコメントは次のとおりです。)から
echo foo | { cat; cat bar; }
または
echo foo | cat - bar
2つの右側は、読み取る前に最初に標準入力を読みますbar
。
答え2
私はこれを調べるのにもっと時間を費やしました、そして私が見つけたアクションはzsh
次のとおりです。MULTIOS
オプション、デフォルトで有効になっています。 bash
同様のオプションがないように見えるため、この動作はのみ適用されますzsh
。