Ich versuche, einen Befehl zu schreiben, der gleichzeitig (i) von stdin und (ii) von einer Pipe lesen kann. Dieses Grundkonzept funktioniert in zsh
, aber nicht in bash
. Die folgende Sitzung veranschaulicht den Unterschied im Verhalten der beiden Shells:
$ 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
Ich sehe, dass die obigen Befehle cat
zwei Quellen für stdin liefern (die Pipe und die Umleitung), also ist es vielleicht nicht eindeutig, wie das gehandhabt werden soll. zsh
scheint die beiden Eingabeströme zu verketten, wobei die gepipete Eingabe stets zuerst kommt. bash
scheint die gepipete Eingabe einfach zu löschen.
Meine Fragen sind:
- Warum verhalten sich die beiden Schalen unterschiedlich?
- Gibt es eine Möglichkeit,
bash
ein solches Verhalten zu erzwingenzsh
?
Antwort1
Wie Sie bemerkt haben,MULTIOS
Shell-OptionDies wird dadurch ermöglicht. In der Shell zsh
ist keine ähnliche Funktion integriert .bash
In bash
würden Sie dasselbe Verhalten erhalten (für dieses spezielle Beispiel sieheOnkel Billys Kommentar unten) aus
echo foo | { cat; cat bar; }
oder
echo foo | cat - bar
Beide rechten Seiten lesen zuerst ihre Standardeingaben, bevor sie lesen bar
.
Antwort2
Ich habe mir das etwas genauer angesehen und festgestellt, dass das Verhalten von zsh
auf dieMULTIOS
Möglichkeit, das standardmäßig aktiviert ist. bash
scheint keine vergleichbare Option zu haben, daher ist dieses Verhalten spezifisch für zsh
.