No bash, um comando vazio com um redirecionamento apenas abre o arquivo da maneira associada ao redirecionamento e, em seguida, o fecha *. echo "hello" >&0 | > file.txt é um comando composto composto por dois comandos simples echo "hello" >&0 , > file.txt , piped. O segundo comando está vazio, então o bash apenas abre o arquivo para escrita, truncando-o e depois fecha-o.
Em um terminal, geralmente a entrada, saída e erro padrão são todos conectados ao terminal. Então, quando você redireciona stdout para stdin, ele ainda está apontando para o terminal, e a saída de echo hello >&0 é vista no terminal e não é enviada para o pipe.
Em zsh, um comando vazio com um redirecionamento ter cat seja o comando. Portanto, echo "hello" >&0 | > file.txt é efetivamente echo "hello" >&0 | cat > file.txt e você verá o efeito desejado. Isso não é possível no bash. Aqui, você verá outro recurso de redirecionamento não visto no bash: quando você redireciona a saída de um comando várias vezes, a saída é enviada para cada um desses destinos redirecionados (assim, o hello é enviado para o terminal e para o tubo). No bash, é enviado apenas para o último local redirecionado.
* A exceção é a substituição de comandos com stdin redirecionado. Em $(<some-file) , o bash lerá o conteúdo de some-file e o usará como o valor da substituição do comando.