Esse é o efeito do MULTIOS .
echo foo >&2 | grep foo
irá escrever foo
para stderr e também canalizar foo
para grep
. Como stderr assume como padrão o terminal, você verá duas foo
linhas, uma de echo
, uma do grep
resultado.
{ echo foo >&2 | grep foo } >/dev/null
Aqui, você viu uma linha porque o stdout foi redirecionado para /dev/null
, apenas a foo
linha de echo
.
{ echo foo >&2 | grep foo } 2>/dev/null
Aqui, você viu uma linha porque o stderr foi redirecionado /dev/null
, você só viu a foo
linha de grep
.
Você pode ver facilmente a diferença no terminal pela cor de saída da linha. grep
destacará o padrão correspondente (ou você pode forçá-lo usando --color=always
).
MULTIOS
foi ativado por padrão com a nomultios
opção não configurada:
$ unsetopt | grep nomultios
nomultios
Para desativá-lo, basta definir a nomultios
opção:
$ setopt nomultios
{echo foo >&2} | grep foo
, se você vê o que estou tentando dizer. Eu pensei que o comando que eu perguntei acima teria redirecionado o stdout para o stderr e, em seguida, transferiu o stdout vazio para o grep.{echo foo >&2} | grep foo
,{echo foo >&2}
foi considerado como um comando e foi executado em um subshell. Você pode pensar comoA | grep foo
ondeA
está{echo foo >&2}
. Nesse caso,>&2
e|
foram separados,MULTIOS
não tem efeito aqui.