Ese es el efecto de MULTIOS .
echo foo >&2 | grep foo
escribirá foo
en stderr y tubería foo
a grep
. Debido a que stderr está predeterminado en la terminal, verá dos foo
líneas, una desde el echo
otro, desde el grep
resultado.
{ echo foo >&2 | grep foo } >/dev/null
Aquí, viste una línea porque stdout fue redirigido a /dev/null
, solo viste la foo
línea desde echo
.
{ echo foo >&2 | grep foo } 2>/dev/null
Aquí, viste una línea porque stderr fue redirigido a /dev/null
, solo viste la foo
línea desde grep
.
Puede ver fácilmente la diferencia en el terminal por el color de salida de la línea. grep
resaltará el patrón coincidente (o puede forzarlo al usarlo --color=always
).
MULTIOS
estaba habilitado de forma predeterminada con la nomultios
opción sin configurar:
$ unsetopt | grep nomultios
nomultios
Para deshabilitarlo, solo configure la nomultios
opción:
$ setopt nomultios
{echo foo >&2} | grep foo
, si ves lo que estoy tratando de decir. Pensé que el comando que pregunté anteriormente habría redirigido stdout a stderr y luego canalizar stdout vacío a grep.{echo foo >&2} | grep foo
,{echo foo >&2}
fue considerado como un comando, y se ejecutó en una subshell. Puedes pensarlo comoA | grep foo
dondeA
está{echo foo >&2}
. En este caso,>&2
y|
fueron separados,MULTIOS
no tiene ningún efecto aquí.