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.