Por que esse comando cria um arquivo muito grande?

19

Eu estava experimentando hoje com algumas operações de acréscimo e, em minha curiosidade, executei isto (em que file1.txt era não-vazio e arquivo2.txt estava vazio):

$ cat file1.txt >> file2.txt >> file1.txt

Quando eu vi isso demorando, apertei Ctrl + C para finalizá-lo. Até então, file1.txt tinha centenas de MB de tamanho.

Mudar os nomes dos arquivos não produz o mesmo efeito; somente quando os arquivos estão nessa ordem, o redirecionamento infinito acontece. O que exatamente está acontecendo que causa isso?

    
por Matt 11.09.2013 / 01:32

2 respostas

24

Você não pode dizer a cat para usar vários critérios desse modo, o último redirecionamento tem precedência:

cat file1.txt >> file2.txt >> file1.txt

é equivalente a:

>> file2.txt ; cat file1.txt >> file1.txt

que obviamente enche rapidamente o sistema de arquivos, dado o fato de que o arquivo de origem que é o destino também cresce indefinidamente, desde que file1.txt seja grande o suficiente para não ser lido de uma vez.

A maioria das implementações cat modernas deve detectar a recursividade e abortar:

Solaris cat:

cat: input/output files 'file1.txt' identical

Gnu cat:

cat: file1.txt: input file is output file

Eles podem ser enganados de qualquer maneira com algo como:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

Um bom uso não tão inútil de gatos ...

    
por 11.09.2013 / 01:36
3

Eu não consegui reproduzir isso em um shell Bash:

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

1 arquivo é criado com comprimento 0, mas depois eu recebo a mensagem acima:

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

Com base na resposta do @ jlliagre, não sei por que estou obtendo os dois arquivos. Pode ser dependente da implementação cat .

EDIT # 1

@jlliagre atualizou sua resposta para mostrar este código que ele afirma ser equivalente:

>> file2.txt ; cat file1.txt >> file1.txt

Então agora eu sei porque estou recebendo o file2.txt vazio. Esta notação é legal:

>> file2.txt

E criará um arquivo vazio.

    
por 11.09.2013 / 01:36