Это эффект 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.