При використанні >
файл відкривається в режимі усікання, тому його вміст видаляється до того, як команда намагатиметься його прочитати.
При використанні >>
файл відкривається в режимі додавання, щоб збереглись наявні дані. Однак у цьому випадку все ще досить ризиковано використовувати той самий файл, що і введення та вихід. Якщо файл достатньо великий, щоб не відповідати розміру буфера введення для читання, його розмір може зростати нескінченно до тих пір, поки файлова система не заповниться (або не буде досягнута квота вашого диска).
Якщо ви хочете використовувати файл як вхідний, так і вихідний з командою, яка не підтримує модифікацію на місці, ви можете використовувати пару обхідних завдань:
Використовуйте файл-посередник і перезаписуйте оригінал, коли це зроблено, і лише якщо помилка під час роботи утиліти не сталася (це найбезпечніший і поширений спосіб).
fold foo.txt > fold.txt.$$ && mv fold.txt.$$ foo.txt
Уникайте файлу-посередника за рахунок потенційної часткової або повної втрати даних у разі помилки чи переривання. У цьому прикладі вміст foo.txt
передається як вхід до підшару (всередині дужок) перед тим, як файл буде видалений. Попередній вхід залишається живим, оскільки підрозділ підтримує його відкритим під час читання даних. Файл, записаний внутрішньою утилітою (тут fold
), маючи те саме ім'я (foo.txt
) вказує на інший inode, оскільки старий запис каталогу був видалений настільки технічно, під час процесу є два різних "файли" з тим самим іменем. Коли закінчується нижня оболонка, старий ввід звільняється, а його дані втрачаються. Слідкуйте за тим, щоб у вас було достатньо місця для тимчасового зберігання як старого, так і нового файлу одночасно, інакше ви втратите дані.
(rm foo.txt; fold > foo.txt) < foo.txt