
Quando eu digito
cat some_file > new_file1 > new_file2
Recebi saída de some_file
in new_file2
e empty new_file1
.
Qual é a lógica interna nisso? Mais especificamente, qual é o stdout
arquivo of?
Nota: No Windows, o arquivo do meio é ignorado.
Responder1
Depende da casca.
No bash, echo derp >file1 >file2
primeiro abre file1
, trunca-o e depois organiza para que o stdout
of echo derp
seja gravado em file1
. Então o bash faz o mesmo para file2
: ele abre file2
, trunca-o e faz com que stdout
of echo derp
seja gravado em file2
.
O efeito líquido é que ele file1
é truncado (ou seja, o conteúdo é excluído) e stdout
entra 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 | cat
os resultados em "derp" são gravados no arquivo, não no pipe.
No zsh, entretanto, echo derp >file1 >file2
grava em file1
and file2
, como você pode esperar intuitivamente. Consulte MULTIOS man zshmisc
para 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
.