Единственный простой и безопасный способ изменить входной файл с помощью инструментов bash - это использовать временный файл, например. sed -i
использует временный файл за кулисами (но для устойчивости sed
нужно больше).
Некоторые из используемых методов имеют тонкую ловушку «может сломать вещи», когда вместо запуска команды в файле данных real вы запускаете его по символической ссылке (в файл, который вы собираетесь изменить). Если не принять правильное решение, это может привести к разрыву ссылки и преобразованию ее в настоящий файл, который получает моды и оставляет оригинальный настоящий файл без намеченных модов и без символической ссылки (без ошибок результаты кода выхода)
Чтобы избежать этого с sed
, вам нужно использовать опцию --follow-symlinks
.
Для других методов, просто имейте в виду, что он должен следовать символическим ссылкам (когда вы действуете по такой ссылке)
Используя временный файл, rm temp file
работает, только если «файл» не является символической ссылкой.
Один безопасный способ - использовать sponge
из пакета moreutils
В отличие от перенаправления оболочки, губка впитывает весь свой ввод перед
открытие
выходной файл. Это позволяет строить конвейеры, которые читают из
и записать в тот же файл.
sponge
- это хороший общий способ справиться с такой ситуацией.
Вот пример использования sponge
hbu=~/'Documents/Homebrew Updates.txt'
{ date "+%Y-%m-%d at %H:%M"; cat "$hbu"; } | sponge "$hbu"