Что означает изменение файла на месте, например, через sed -i
или perl -i
?
Мой вопрос о том, как сделать эту модификацию на месте. Копируется ли файл, выполняется ли изменение в копии, а затем заменяется оригиналом? Или исходный файл как-то изменяется на месте?
10
ex
илиvi
?ex
поддерживает почтовый файл (например,dead.mail
или что-то в вас, и другой, обычно рядом с вашим почтовым буфером) . проверьте спецификации - у каждого из них есть определенное состояние с большой длиной ...ex
в большинстве случаев он имеет свой собственный двоичный формат (посмотрите на ваш-rescue
файл), и это используется для обнуления отдельных временных файлов буфера (возможно, до шести) . так что они копируют входные блоки для редактирования буферов и синхронизируют записи в смещения за изменения:!written
?Ответы:
sed
создает временный файл, записывает выходные данные в этот файл и затем переименовывает временный файл поверх оригинала.Вы можете посмотреть, что происходит, используя
strace
:Это регистрирует все операции,
sed
выполняемые с файлами : он создает новый файл (безопасно с нимO_CREAT|O_EXCL
), записывает в него данные и затем перемещает их обратно поверх моего исходного файлаa
.sed -i
принимает суффикс для использования в качестве резервной копии, и в этом случае он сначала удаляет оригинал (а не переименовывает поверх). Этот аргумент является обязательным в большинстве BSDsed
. В этом случае, существует короткое время, когда в каталоге нет файла с правильным именем.perl
в последних версиях открывает входной файл, затем удаляет его и создает новый файл с тем же именем:Когда вы удаляете (
unlink
) файл, который вы уже открыли, вы сохраняете доступ к нему до тех пор, пока сохраняете дескриптор, чтобы он мог продолжать чтение данных из удаленного файла. Таким образом,perl
записывается непосредственно в выходной файл, а не во временный файл: дополнительный файл не создается, но если вы прочитаете файл во время процесса, вы получите частичное содержимое, в отличие отsed
подхода, используемого в этом подходе. Также существует короткое время, когда нет файла с правильным именем, который находится в начале процесса, а не в конце (как вsed -i .bak
).И так
sed
иperl
будет:setgid
бит), если он принадлежал группе, в которой вы не находитесь и не являетесь пользователем root.setuid
иsetgrp
биты, если результирующая группа совпадает с группой, в которой она была начата.sed
воля:perl
воля:Вышесказанное верно для Linux с GNU
sed
и Mac OS X с его (производным от FreeBSD)sed
.источник
В дополнение к ответу @ Гомера, из
perldoc perlrun
:И помните, что ни мягкая ссылка, ни жесткая ссылка не сохраняются:
Это также объясняет, почему вы должны использовать
-i
с-p
параметром, или использовать явноеprint
выражение, если вы хотите редактировать на месте с помощьюperl
:источник