Это эффект MULTIOS .
echo foo >&2 | grep foo
напишет foo
в stderr, а также трубу foo
к grep
. Так как stderr по умолчанию использует терминал, вы увидите две foo
строки, одну из которых echo
, одну из grep
результата.
{ echo foo >&2 | grep foo } >/dev/null
Здесь вы видели одну строку, потому что stdout был перенаправлен на /dev/null
, вы видели только foo
строку с echo
.
{ echo foo >&2 | grep foo } 2>/dev/null
Здесь вы видели одну строку, потому что stderr был перенаправлен на /dev/null
, вы видели только foo
строку с grep
.
Вы можете легко увидеть разницу в терминале по цвету линейного выхода. grep
выделит соответствующий шаблон (или вы можете принудительно его использовать --color=always
).
MULTIOS
был включен по умолчанию с nomultios
опцией unset:
$ unsetopt | grep nomultios
nomultios
Чтобы отключить его, просто установите nomultios
опцию:
$ setopt nomultios
{echo foo >&2} | grep foo
, если вы видите, что я пытаюсь сказать. Я думал, что команда, о которой я спрашивал выше, перенаправит stdout в stderr, а затем перенаправит пустой stdout в grep.{echo foo >&2} | grep foo
,{echo foo >&2}
был рассмотрен как команда, и он работал в подоболочке. Вы можете думать , что нравится ,A | grep foo
гдеA
это{echo foo >&2}
. В этом случае>&2
и|
были отделены,MULTIOS
здесь не действует.