(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
にstdinの2つのソース(パイプとリダイレクト)を提供していることがわかります。そのため、それをどのように処理する必要があるかはあいまいです。 zsh
は2つの入力ストリームを連結しているようで、パイプで連結された入力が常に最初に来ます。 bash
は単純にパイプされた入力をドロップするようです。
私の質問は:
bash
をzsh
のように動作させる方法はありますか?お気づきのように、これを可能にするのがMULTIOS
の- zsh
シェルオプション です。 bash
シェルには、同様の組み込み機能はありません。
bash
では、同じ動作が得られます(この特定の例については、以下の ncle Billyのコメント を参照)。
echo foo | { cat; cat bar; }
または
echo foo | cat - bar
これらの右側はどちらも、bar
を読み取る前にまず標準入力を読み取ります。
もう少し時間をかけて調べましたが、zsh
の動作は MULTIOS
option が原因であることがわかりました。これはデフォルトで有効になっています。 bash
には同等のオプションがないため、この動作はzsh
に固有です。