Seu primeiro canal:
1>&2 echo hi |& grep hi
Isso é o mesmo que
echo hi 1>&2 2>&1 | grep hi
desde |&
é o mesmo que 2>&1 |
.
Com a opção MULTIOS
shell definida, isso duplicaria a saída de echo
para o erro padrão. Isso produz o hi
não colorido que grep
nunca vê. O outro hi
passa por grep
e é colorido.
O redirecionamento 2>&1
não faz nada, pois não há saída para o erro padrão de echo
. Seria diferente se você tivesse, por exemplo,
{ echo hi 1>&2; } 2>&1 | grep hi
ou
{ echo hi 1>&2; } |& grep hi
em que a saída padrão de echo
seria não duplicada e o erro padrão de { ...; }
teria sido enviado para grep
, produzindo uma única cor hi
.
Seu segundo pipeline,
1>&2 echo hi | grep hi
ou
echo hi 1>&2 | grep hi
(que é o mesmo que o seu primeiro pipeline com o redirecionamento não-op 2>&1
removido) também redireciona a saída padrão duas vezes; uma vez para o erro padrão (o hi
não colorido), e para o pipe (o hi
colorido).
Para duas cores hi
:
echo hi 2>&1 1>&2 | grep hi
ou
echo hi 1>&1 | grep hi
(Isto é com um pequeno handwaving já que eu não estou acostumado com o zsh
shell)