Bash

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

  • April 7, 2020

我正在嘗試編寫一個可以同時(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. 為什麼兩個外殼的行為不同?
  2. 有什麼辦法可以強製bash表現得像zsh

正如您所注意到的,其中的MULTIOSshell 選項使zsh這成為可能。bash外殼中沒有類似的內置設施。

在中,bash會從

echo foo | { cat; cat bar; }

或者

echo foo | cat - bar

這兩個右手邊在讀取之前首先讀取它們的標準輸入bar

我花了一些時間看這個,我發現 的行為zsh是由於預設啟用 的MULTIOSoption引起的。bash似乎沒有可比的選項,因此此行為特定於zsh.

引用自:https://unix.stackexchange.com/questions/578365