Программы Unix могут иметь переключатель -i inplace
(например, в более ранней версии sed
его нет, но в большинстве случаев он есть, украв этот флаг из perl
), подробности см. на странице man
. Это обычно приводит к тому, что программа записывает вывод во временный файл, а затем выполняет вызов rename(2)
для записи нового вывода поверх исходного имени (это переименование может также разрушить контексты selinux или другие причудливые ACL в процессе, что может быть проблемой, если вы используете эти вещи).
Другим решением шаблона записи-в-tmp-файл-и-rename(2)
является губка
из moreutils
:
$ echo hi > file
$ tr h b < file | sponge file
$ cat file
bi
$