在不更改索引节点的情况下一致地编辑文件(此处使用的数据库系统术语意义上的一致性)的最佳方法是什么?通常,我会写入一个临时文件,然后调用rename(2)
,但由于这会更改 inode,所以这不是一个选项。我想到了类似的东西modify_file <file >tmp && cat <tmp >file
,但修改要么完全发生,要么根本不发生(modify_file
是修改标准输入内容的过程)。使用普通的 shell 实用程序可以实现这一点吗?我认为以下内容可能涵盖大多数情况(除了SIGKILL
断电之外):
(
flock -x 9
trap '' INT TERM # (perhaps other signals)
modify_file <file >tmp && cat <tmp >file
) 9>>file
对于只想更改文件的某个字节序列的子情况,会ed
是更好的选择吗?