Soweit ich die Bash-Dokumentation verstehe, sind beide | und <stdin umleiten. Also cmd | foo
und foo < <(cmd)
sollte mehr oder weniger gleichwertig sein. Für den Befehl bash-internal read scheint dies jedoch nicht der Fall zu sein. ZB wenn ich eintrete
a=""; b=""; read a b < <(echo a b); echo $a $b
es wird ausgedruckt a b
, während
a=""; b=""; echo a b | read a b; echo $a $b
druckt nichts aus. Auf der anderen Seite, wenn ich eintrete
a=""; b=""; cat < <(echo a b) >foo1
a=""; b=""; echo a b | cat > foo2
Die Dateien foo1 und foo2 sind genau gleich. Meine Frage lautet also: Was ist der Unterschied zwischen beiden Formularen, wenn der Lesebefehl beteiligt ist (oder allgemein)? Sie sollten genau dieselbe umgeleitete Eingabe sehen. Während das < <(...)
Formular funktioniert, finde ich es ziemlich unlesbar und würde es sehr bevorzugen, das Pipe-Formular zu verwenden.
bash
io-redirection
Elmar Zander
quelle
quelle
Antworten:
Das Pipelining wird
read
in einer Subshell ausgeführt, während die Prozessersetzung dies nicht tut. In den meisten Anwendungsfällen ist dies kein Problem, aber in diesem Fall möchten Sie die Shell direkt beeinflussen (indem Sie Variablen bearbeiten). Daread
in einer Subshell aufgerufen wurde, ist nur die Subshell betroffen. Daher müssen alle Aktionen, die Sie möglicherweise ausführen möchten, auch in der Subshell ausgeführt werden. zum Beispiel:quelle