我正在嘗試編寫一個命令,該命令可以同時(i)從標準輸入讀取和(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
我可以看到上面的命令提供了cat
兩個標準輸入來源(管道和重定向),所以也許應該如何處理它是不明確的。 zsh
似乎連接了兩個輸入流,管道輸入始終排在第一位。 bash
似乎只是刪除管道輸入。
我的問題是:
- 為什麼兩個 shell 的行為不同?
- 有什麼辦法可以強迫
bash
自己表現得像這樣zsh
嗎?
答案1
正如您所注意到的,MULTIOS
外殼選項正是zsh
這使得這一切成為可能。 shell中沒有類似的內建設施bash
。
在 中bash
,您將得到相同的行為(對於這個特定範例;請參閱以下是比利叔叔的評論) 從
echo foo | { cat; cat bar; }
或者
echo foo | cat - bar
這兩個右側在讀取之前首先讀取其標準輸入bar
。
答案2
我花了更多時間研究這個,我發現 的行為zsh
是由於MULTIOS
選項,預設情況下啟用。 bash
似乎沒有類似的選項,因此此行為特定於zsh
.