Bash
為什麼這個管道中第一個命令的標準輸出沒有被處理?
我正在嘗試編寫一個可以同時(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
似乎只是放棄了管道輸入。我的問題是:
- 為什麼兩個外殼的行為不同?
- 有什麼辦法可以強製
bash
表現得像zsh
?
正如您所注意到的,其中的
MULTIOS
shell 選項使zsh
這成為可能。bash
外殼中沒有類似的內置設施。在中,您
bash
會從echo foo | { cat; cat bar; }
或者
echo foo | cat - bar
這兩個右手邊在讀取之前首先讀取它們的標準輸入
bar
。
我花了一些時間看這個,我發現 的行為
zsh
是由於預設啟用 的MULTIOS
option引起的。bash
似乎沒有可比的選項,因此此行為特定於zsh
.