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)