Ese es el efecto de MULTIOS .
echo foo >&2 | grep foo
escribirá fooen stderr y tubería fooa grep. Debido a que stderr está predeterminado en la terminal, verá dos foolíneas, una desde el echootro, desde el grepresultado.
{ echo foo >&2 | grep foo } >/dev/null
Aquí, viste una línea porque stdout fue redirigido a /dev/null, solo viste la foolí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 foolínea desde grep.
Puede ver fácilmente la diferencia en el terminal por el color de salida de la línea. grepresaltará el patrón coincidente (o puede forzarlo al usarlo --color=always).
MULTIOSestaba habilitado de forma predeterminada con la nomultiosopción sin configurar:
$ unsetopt | grep nomultios
nomultios
Para deshabilitarlo, solo configure la nomultiosopció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 foodondeAestá{echo foo >&2}. En este caso,>&2y|fueron separados,MULTIOSno tiene ningún efecto aquí.