Warum wird die Standardausgabe des ersten Befehls in dieser Pipe nicht verarbeitet?

Warum wird die Standardausgabe des ersten Befehls in dieser Pipe nicht verarbeitet?

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 catzwei Quellen für stdin liefern (die Pipe und die Umleitung), also ist es vielleicht nicht eindeutig, wie das gehandhabt werden soll. zshscheint die beiden Eingabeströme zu verketten, wobei die gepipete Eingabe stets zuerst kommt. bashscheint die gepipete Eingabe einfach zu löschen.

Meine Fragen sind:

  1. Warum verhalten sich die beiden Schalen unterschiedlich?
  2. Gibt es eine Möglichkeit, bashein solches Verhalten zu erzwingen zsh?

Antwort1

Wie Sie bemerkt haben,MULTIOSShell-OptionDies wird dadurch ermöglicht. In der Shell zshist keine ähnliche Funktion integriert .bash

In bashwü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 zshauf dieMULTIOSMöglichkeit, das standardmäßig aktiviert ist. bashscheint keine vergleichbare Option zu haben, daher ist dieses Verhalten spezifisch für zsh.

verwandte Informationen