Це НЕ працює:
# 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
.
Існує декілька способів, як можна обдурити. Ви можете відкрити файл, а потім від’єднати його - файл буде існувати до тих пір, поки ви його не закриєте, а потім створити новий файл з тим самим іменем і записати до нього gzipped дані. Однак я не знаю очевидного способу примусити башти використовувати це, і навіть якби я це зробив, моя відповідь все одно буде:
Навіть не роби цього.
Якщо gzip
з будь-якої причини виходить з ладу або виникає якась проблема, наприклад, у вас не вистачає місця під час gzipping (оскільки інші процеси записуються, або результат gzip більший, ніж вхідні дані - що відбувається з випадковими даними - тощо), ви просто втратили файл . Вітаємо!
Створіть окремий файл та mv
на успіх. Це найпростіший, зрозумілий і найнадійніший метод, який ви коли-небудь знайдете.