Digamos que temos uma pasta com dois arquivos:
file_empty
, não contendo nadafile_in
, contendo apenas uma linha: "algo"
Veja a saída dos exemplos a seguir:
(echo "test" > file_test; < file_empty cat) > file_out
resultará em file_out
estar vazio.
(echo "test" > file_test; < file_in cat) > file_test
resultará em file_test
ter o conteúdo "algo".
Finalmente,
(echo "test" > file_test; < file_empty cat) > file_test
resultará em file_test
conter "teste".
Para o último exemplo, eu esperaria file_test
que estivesse vazio, como no primeiro exemplo. Você poderia me explicar por que ele conterá "test"?
Duas coisas importantes:
echo
sempre é executado antes decat
.> file_test
cria uma descrição de arquivo aberto independente .Seu primeiro exemplo é simples:
echo
escreve emfile_test
, depoiscat
copia o conteúdo defile_empty
parafile_out
.No segundo e no terceiro exemplo
file_test
é aberto e truncado duas vezes. Primeiro o "externo"> file_test
abre e trunca o arquivo, então o outro> file_test
abre e trunca o arquivo paraecho
; somente entãoecho
executa, finalmentecat
executa.Na verdade,
echo
escreve parafile_test
a partir do início do arquivo ecat
escreve parafile_test
independentemente do início do arquivo. As duas ferramentas não compartilham uma descrição de arquivo aberto, então o ato de escrever porecho
não move a posição no arquivo paracat
. A última ferramenta (sobre)escreve no arquivo a partir do início, não de ondeecho
terminou.Especificamente, no segundo exemplo,
echo
ele gravatest
no arquivo e, em seguida,cat
inseresomething
o arquivo desde o seu início , sobrescrevendo-otest
.No terceiro exemplo,
echo
gravatest
no arquivo e, em seguida,cat
coloca uma string vazia no arquivo desde o seu início, sem substituir nada (já que o tamanho da string vazia é zero bytes).Para ver melhor o que acontece, considere isto:
Primeiro
echo
escreve12…
no arquivo, depoiscat
colocasomething
no arquivo desde o seu início, sobrescrevendo12…89
comsomething
e0
com o caractere de nova linha de terminação defile_in
(estou assumindo que a linha que dizsomething
está corretamente terminada dentro defile_in
). O conteúdo defile_test
agora é:(com um caractere de nova linha de terminação após
interesting
, adicionado porecho
em primeiro lugar).É diferente com
porque
>>
é essencialmente "sempre procurar o fim do arquivo" . Desta vezcat
escreve de ondeecho
terminou, porque no momento é aqui que o arquivo termina. Tente. O resultado é:(com um caractere de nova linha de terminação de
file_in
).Além disso, se as duas ferramentas realmente compartilharem uma descrição de arquivo aberto (criada com
>
), entãoecho
moverá a posição no arquivo paracat
:O resultado é novamente
(com um caractere de nova linha de terminação de
file_in
).