Questo non funziona:
# 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>
Questa è una condizione di gara:
# 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
Il problema è che il > example.txt (o dd of=example.txtdel resto) uccide il file prima che l'altro processo abbia la possibilità di leggerlo. Quindi non esiste una soluzione ovvia, motivo per cui dovresti attenerti mv.
Esistono diversi modi per barare. Puoi aprire il file, quindi scollegarlo - il file continuerà a esistere fino a quando non lo chiuderai - e quindi creare un nuovo file con lo stesso nome e scrivere i dati compressi con quello. Comunque non conosco un modo ovvio per costringere Bash a usarlo, e anche se lo facessi, la mia risposta sarebbe ancora:
Non farlo nemmeno.
Se gzip fallisce per qualsiasi motivo o si verifica un problema, ad esempio quando si esaurisce lo spazio durante il gzipping (perché altri processi stanno scrivendo, o il risultato gzip è più grande dell'input - che accade per dati casuali - ecc.), Hai appena perso il tuo file . Congratulazioni!
Crea un file separato e mvin caso di successo. Questo è il metodo più semplice, facile da capire e più affidabile che tu abbia mai trovato.