Це НЕ працює:
# 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на успіх. Це найпростіший, зрозумілий і найнадійніший метод, який ви коли-небудь знайдете.