Estoy intentando escribir un comando que pueda simultáneamente (i) leer desde la entrada estándar y (ii) leer desde una tubería. Este concepto básico funciona en zsh
, pero no en bash
. La siguiente sesión ilustra la diferencia de comportamiento de los dos 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
Puedo ver que los comandos anteriores proporcionan cat
dos fuentes de entrada estándar (la canalización y la redirección), por lo que tal vez sea ambiguo cómo se debe manejar eso. zsh
parece concatenar los dos flujos de entrada, con la entrada canalizada siempre primero. bash
parece simplemente eliminar la entrada canalizada.
Mis preguntas son:
- ¿Por qué los dos caparazones se comportan de manera diferente?
- ¿Hay alguna manera de obligar
bash
a comportarse comozsh
?
Respuesta1
Como habrás notado, elMULTIOS
opción de shellin zsh
es lo que hace esto posible. No hay ninguna instalación similar incorporada en el bash
armazón.
En bash
, obtendría el mismo comportamiento (para este ejemplo en particular; consulteEl comentario del tío Billy a continuación.) de
echo foo | { cat; cat bar; }
o
echo foo | cat - bar
Ambos lados derechos primero leen sus entradas estándar antes de leer bar
.
Respuesta2
Pasé un poco más de tiempo mirando esto y descubrí que el comportamiento de zsh
se debe a laMULTIOS
opción, que está habilitado de forma predeterminada. bash
No parece tener una opción comparable, por lo que este comportamiento es específico de zsh
.