Isso não funciona:
# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>
Esta é uma condição de corrida:
# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt
Hello World # may also be empty
O problema é que o > example.txt
(oudd of=example.txt
esse assunto) mata o arquivo antes que o outro processo tenha a chance de lê-lo. Portanto, não há uma solução óbvia, e é por isso que você deve se ater mv
.
Existem várias maneiras de trapacear. Você pode abrir o arquivo e desvinculá-lo - o arquivo continuará existindo até você fechá-lo - e criar um novo arquivo com o mesmo nome e gravar os dados compactados nele. No entanto, eu não conheço uma maneira óbvia de coagir o bash a usá-lo, e mesmo se soubesse, minha resposta ainda seria:
Nem faça isso.
Se gzip
falhar por qualquer motivo ou ocorrer algum problema, como você ficar sem espaço enquanto faz o gzip (porque outros processos estão gravando ou o resultado do gzip é maior que a entrada - o que acontece com dados aleatórios - etc.), você acabou de perder o arquivo . Parabéns!
Crie um arquivo separado e mv
com sucesso. Esse é o método mais simples, fácil de entender e mais confiável que você encontrará.