Это не работает:
# 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>
Это условие гонки:
# 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
Проблема в том, что > example.txt(или dd of=example.txtв этом отношении) убивает файл, прежде чем другой процесс сможет его прочитать. Так что нет очевидного решения, поэтому вы должны придерживаться mv.
Есть несколько способов обмануть. Вы можете открыть файл, затем отсоединить его - файл будет существовать до тех пор, пока вы его не закроете, - а затем создать новый файл с тем же именем и записать в него сжатые данные. Однако я не знаю очевидного способа заставить bash использовать это, и даже если бы я знал, мой ответ все равно будет:
Даже не делай этого.
Если gzipпо какой-либо причине происходит сбой или возникает какая-либо проблема, например, когда у вас не хватает места во время gzipping (потому что другие процессы пишут, или результат gzip больше, чем ввод - что происходит для случайных данных - и т. Д.), Вы просто потеряли свой файл , Поздравляем!
Создайте отдельный файл и mvв случае успеха. Это самый простой, легкий для понимания и самый надежный метод, который вы когда-либо найдете.