Lógica interna de redirecionamentos encadeados

2

Quando eu digito

cat some_file > new_file1 > new_file2

Eu recebi a saída de some_file em new_file2 e esvazie new_file1 .

Qual é a lógica interna disso? Mais especificamente, qual é o stdout do arquivo?

Nota: No Windows, o arquivo do meio é ignorado.

    
por jnovacho 12.10.2013 / 21:32

1 resposta

4

Depende do shell.

No bash, echo derp >file1 >file2 primeiro abre file1 , trunca e organiza para que stdout de echo derp seja gravado em file1 . Em seguida, o bash faz o mesmo para file2 : abre file2 , trunca e organiza para que stdout de echo derp seja escrito em file2 .

O efeito líquido é que file1 é truncado (ou seja, o conteúdo é excluído) e stdout entra apenas em file2 . Não há encadeamento acontecendo. O Bash só é capaz de redirecionar o stdout para um lugar por vez. Isso vale também para pipes: echo derp > file | cat resulta em "derp" escrito no arquivo, não no pipe.

No zsh, no entanto, echo derp >file1 >file2 grava em file1 e file2 , como você pode esperar intuitivamente. Veja MULTIOS em man zshmisc para detalhes se você usar zsh.

Para conseguir isso fora de zsh , você pode simplesmente usar tee : echo derp | tee file1 file2 > /dev/null é equivalente a echo derp >file1 >file2 de zsh.

    
por 12.10.2013 / 23:19