為什麼這個管道中第一個指令的標準輸出沒有被處理?

為什麼這個管道中第一個指令的標準輸出沒有被處理?

我正在嘗試編寫一個命令,該命令可以同時(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似乎只是刪除管道輸入。

我的問題是:

  1. 為什麼兩個 shell 的行為不同?
  2. 有什麼辦法可以強迫bash自己表現得像這樣zsh嗎?

答案1

正如您所注意到的,MULTIOS外殼選項正是zsh這使得這一切成為可能。 shell中沒有類似的內建設施bash

在 中bash,您將得到相同的行為(對於這個特定範例;請參閱以下是比利叔叔的評論) 從

echo foo | { cat; cat bar; }

或者

echo foo | cat - bar

這兩個右側在讀取之前首先讀取其標準輸入bar

答案2

我花了更多時間研究這個,我發現 的行為zsh是由於MULTIOS選項,預設情況下啟用。 bash似乎沒有類似的選項,因此此行為特定於zsh.

相關內容