Um operador de redirecionamento muda para onde a saída está indo (ou de onde a entrada está vindo). 3>&1
significa “tornar descritor de arquivo 3 ponto onde quer que o descritor de arquivo 1 esteja atualmente apontando” (que é o terminal). 3>file
significa "fazer o descritor de arquivo 3 apontar para file
". Nada aconteceu durante o breve tempo que o fd 3 estava apontando para o terminal, então você não obtém nenhuma saída de terminal.
Para obter os mesmos dados em dois locais, algo precisa copiar os dados. Esse é o trabalho de tee
. Para cada byte que ele lê, ele gera esse byte duas vezes (se for fornecido um argumento de arquivo, mais sua saída padrão).
Não se atenha ao fato de que >&
às vezes é chamado de duplicação. O que está duplicando é o descritor de arquivo : 3>&1
duplica fd 1 para fd 3, o que significa que os dados indo para fd 1 e os dados indo para fd 3 estão sendo mesclados - ambos estão indo para onde quer que fd 1 estivesse apontando.
Se você preferir explicações gráficas, consulte o que significa conectar STDOUT e STDIN? e Como um comando pode ter mais de uma saída?
Em qualquer caso, o seu comando não produz nada no descritor de arquivo 3, portanto redirecionar o fd 3 não altera nada. O comando date
grava em sua saída padrão, ou seja, fd 1, e você não está redirecionando isso.
O Zsh tem um recurso chamado multios que altera o significado do redirecionamento de saída. Se houver vários redirecionamentos de saída para o mesmo comando no mesmo descritor de arquivo, então o primeiro muda onde o descritor está apontando, mas os subsequentes replicam os dados para o especificado alvos. Por exemplo, para obter saída em um arquivo além de onde stdout estava apontando, você pode usar
date >&1 >file
Zsh está fazendo o trabalho de tee
. Observe que a ordem de redirecionamentos é importante - date >file >&1
escreveria em file
duas vezes, pois, quando o operador >&1
for avaliado, a saída padrão de date
já estará indo para file
.