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?


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.