Lógica interna de redirecionamentos encadeados

Lógica interna de redirecionamentos encadeados

Quando eu digito

cat some_file > new_file1 > new_file2

Recebi saída de some_filein new_file2e empty new_file1.

Qual é a lógica interna nisso? Mais especificamente, qual é o stdoutarquivo of?

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

Responder1

Depende da casca.

No bash, echo derp >file1 >file2primeiro abre file1, trunca-o e depois organiza para que o stdoutof echo derpseja gravado em file1. Então o bash faz o mesmo para file2: ele abre file2, trunca-o e faz com que stdoutof echo derpseja gravado em file2.

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

No zsh, entretanto, echo derp >file1 >file2grava em file1and file2, como você pode esperar intuitivamente. Consulte MULTIOS man zshmiscpara obter 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 zsh echo derp >file1 >file2.

informação relacionada