redirecionamento de gato

11

Digamos que um arquivo chamado abcexista no diretório atual e tenha algum texto nele. Quando você executa o comando:

cat abc > abc

Por que o conteúdo do arquivo abcdesaparece?
Por que o comando exclui o texto e o arquivo se torna um arquivo vazio?

Tulsi Kanodia
fonte
E, para obter soluções, consulte Posso cutalterar um arquivo?
Gilles 'SO- stop be evil'
10
Um ponteiro laser é uma ferramenta muito eficaz para o redirecionamento de gatos. </pun>
WBT
Meu gato responde muito mal para o redirecionamento ...
Ex Umbris
Para evitar esse problema, eu uso um pouco shellscript que chamei cão :cat abc | dog abc
joeytwiddle
Outra opção, se você não se importa com a saída na tela, é usar tee.
Andrea Lazzarotto 30/08

Respostas:

27

Por causa da ordem de como as coisas são feitas.

Quando você faz:

cat abc > abc

>é o operador de redirecionamento de saída, quando o shell vê isso, ele abre o arquivo no modo de truncamento usando O_TRUNCflag com open(2)ie open("abc", O_TRUNC), portanto, o que quer que estivesse no arquivo desapareceu. Observe que esse redirecionamento é feito primeiro pelo shell antes da catexecução do comando.

Portanto, quando o comando é cat abcexecutado, o arquivo abcjá está truncado e, portanto , o arquivo fica catvazio.

heemail
fonte
1
E o gato abc >> abc? O que acontece depois?
Tulsi Kanodia
2
@TulsiKanodia - que causa um loop infinito. Cada vez que um gato lê uma linha, acrescenta outra antes de passar para a próxima.
user3490
3
Isso é detectado e evitado. Em vez disso, o texto cat: filename: input file is output file(onde filenameestá o nome do arquivo que você escolheu) é impresso no stdout antigo.
UTF-8
5

Adicionando à resposta de @ heemayl , se você quiser que o código seja mais claro sobre a sequência em que as coisas estão acontecendo, basta colocar os redirecionamentos no início do comando:

> abc cat abc
l0b0
fonte