Quando você usa >
, o arquivo é aberto no modo de truncamento para que seu conteúdo seja removido antes que o comando tente lê-lo.
Quando você usa >>
, o arquivo é aberto no modo de acréscimo para que os dados existentes sejam preservados. No entanto, ainda é bastante arriscado usar o mesmo arquivo como entrada e saída nesse caso. Se o arquivo for grande o suficiente para não caber no tamanho do buffer de entrada de leitura, seu tamanho poderá crescer indefinidamente até que o sistema de arquivos esteja cheio (ou sua cota de disco seja atingida).
Se você quiser usar um arquivo como entrada e saída com um comando que não suporta modificação no local, use algumas soluções alternativas:
-
Use um arquivo intermediário e sobrescreva o original quando terminar e somente se nenhum erro ocorrer durante a execução do utilitário (essa é a maneira mais segura e mais comum).
fold foo.txt > fold.txt.$$ && mv fold.txt.$$ foo.txt
-
Evite o arquivo intermediário às custas de uma possível perda de dados parcial ou completa caso ocorra um erro ou interrupção. Neste exemplo, o conteúdo de
foo.txt
é passado como entrada para uma subshell (dentro dos parênteses) antes o arquivo é excluído. O inode anterior permanece ativo, pois o subshell o mantém aberto durante a leitura de dados. O arquivo escrito pelo utilitário interno (aquifold
) enquanto tem o mesmo nome (foo.txt
) aponta para um inode diferente porque a entrada do diretório antigo foi removida, portanto, tecnicamente, existem dois "arquivos" diferentes com o mesmo nome durante o processo. Quando a subshell termina, o inode antigo é liberado e seus dados são perdidos. Cuidado para ter certeza de que você tem espaço suficiente para armazenar temporariamente o arquivo antigo e o novo ao mesmo tempo, caso contrário, você perderá dados.(rm foo.txt; fold > foo.txt) < foo.txt