Redirecionamento de E / S do zsh: redirecionando e depois canalizando; o que está acontecendo?

8

Alguém pode explicar o que está acontecendo neste comando:

echo foo >&2 | grep foo

O Zsh (5.0.2) imprime fooduas vezes. Um aparentemente para stdout e outro para stderr, desde a execução desses comandos:

{ echo foo >&2 | grep foo } >/dev/null

e:

{ echo foo >&2 | grep foo } 2>/dev/null

ambos apenas imprimem foouma vez.

Zorawar
fonte

Respostas:

5

Esse é o efeito do MULTIOS .

echo foo >&2 | grep foo

irá escrever foopara stderr e também canalizar foopara grep. Como stderr assume como padrão o terminal, você verá duas foolinhas, uma de echo, uma do grepresultado.

{ echo foo >&2 | grep foo } >/dev/null

Aqui, você viu uma linha porque o stdout foi redirecionado para /dev/null, apenas a foolinha 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 foolinha de grep.

Você pode ver facilmente a diferença no terminal pela cor de saída da linha. grepdestacará o padrão correspondente (ou você pode forçá-lo usando --color=always).


MULTIOSfoi ativado por padrão com a nomultiosopção não configurada:

$ unsetopt | grep nomultios
nomultios

Para desativá-lo, basta definir a nomultiosopção:

$ setopt nomultios
cuonglm
fonte
Ah, eu não sabia que o zsh poderia fazer isso! Eu (basicamente) entendo o redirecionamento, queria saber por que o comando não era equivalente {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.
Zorawar
@ Zorawar: Essa pergunta não foi abordada em seu post, por isso vou responder aqui. Em {echo foo >&2} | grep foo, {echo foo >&2}foi considerado como um comando e foi executado em um subshell. Você pode pensar como A | grep fooonde Aestá {echo foo >&2}. Nesse caso, >&2e |foram separados, MULTIOSnão tem efeito aqui.
cuonglm
@Zorawar Este é o motivo pelo qual acabei desativando os multios. É uma idéia bonitinha, mas na prática eu achei isso muitas vezes irritante e raramente útil.
Gilles 'SO- stop be evil'
@ Cuonglm, tenho outra pergunta que é feita aqui, mas não recebi nenhuma resposta. Se você conhece e também tem tempo, poderia ajudar?
Liu Sha