Com o comando zsh e com a mult_ios option ativada (ativada por padrão), em :
echo hi 2>&1 1>/dev/null | cat
O 1> /dev/null | cat é visto como um redirecionamento múltiplo do stdout de echo .
Portanto, o stdout de echo agora é redirecionado para /dev/null e um canal para cat (como se estivesse usando tee ).
Para cancelar esse redirecionamento múltiplo, você pode fazer:
echo hi 2>&1 >&- > /dev/null | cat
Ou seja, fechando a stdout (cancelando a tubulação) antes de redirecionar para /dev/null
Ou use um grupo de comando ou subshell como:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
Dessa forma, o stdout de echo só é redirecionado explicitamente uma vez (o redirecionamento de pipe é aplicado ao grupo / subshell e herdado por echo ).
Ou você pode desativar multios ao mesmo tempo:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
Como alternativa, você pode usar substituição de processo em vez de um canal:
echo hi 2> >(cat) > /dev/null
No entanto, esteja ciente de que, quando o controle de tarefa está desativado (como em scripts), o processo cat será executado de forma assíncrona (como se iniciado com & ).