linux - Vim 的行为在保存文件时有所不同
问题描述
目前我正在编写一个 python 脚本来实现在 linux 上使用 pyinotify 进行文件监视。与其他工具不同的是,auditd 日志用于丰富输出。
在几个系统上,我的脚本就像一个魅力,但一个系统在使用 vim 编辑文件时显示了另一种行为:
/etc/login.defs OPEN
/etc/login.defs ACCESS
/etc/login.defs ACCESS
/etc/login.defs CLOSE_NOWRITE,CLOSE
/etc/login.defs MODIFY
/etc/login.defs OPEN
/etc/login.defs MODIFY
/etc/login.defs MODIFY
/etc/login.defs CLOSE_WRITE,CLOSE
/etc/login.defs ATTRIB
/etc/login.defs OPEN
/etc/login.defs ACCESS
/etc/login.defs ACCESS
/etc/login.defs CLOSE_NOWRITE,CLOSE
/etc/login.defs OPEN
/etc/login.defs ACCESS
/etc/login.defs CLOSE_NOWRITE,CLOSE
那很好,因为对文件进行差异化会导致干净的结果。在其他系统上,vim 在写入文件时的行为如下:
/etc/login.defs MOVE_SELF
/etc/login.defs ATTRIB
/etc/login.defs DELETE_SELF
...
creating a new file
有人可以解释为什么 vim 会显示这种行为,以及我如何能够强制我的测试系统上的 vim 以相同的方式运行,以便我能够处理它?
环境:Debain 9.7 vim 版本:2:8.0.0197-4+deb9u1
解决方案
我认为由于 Vim 的备份选项,您会看到不同的结果。默认情况下,Vim 移走原始文件,将更新的文件内容写入不同的(临时)文件名,然后将其重命名为原始文件,最后删除移走的原始文件。这确保即使在两者之间发生了不好的事情,也不会丢失任何数据。
该行为由'backup'
和'writebackup'
Vim 选项控制。请参阅:help backup-table
详细说明。
对于inotify观察,默认行为是有问题的。您可以尝试:set nowritebackup
,但这会增加数据丢失的风险,除非您也:set backup
.
推荐阅读
- java - Collections.reverse() 时间复杂度
- flask - 基于 grunt 的工作流的 Flask 项目结构
- url - 使用 Zapier Push 从 URL 中提取 Salesforce 记录 ID
- javascript - 如何在 2 个空格后将名称分成两部分?
- java - 在图像 javaFx 上画一条线
- python - 不可迭代的python(循环中分配变量的不同整数值并将它们合二为一)
- python - 在我的 pygame 游戏中出现“TypeError: integer argument expected, got float”的原因?
- nginx - 带有自定义 url 的 nginx proxy_pass
- awk - awk,将文件中的行分成两个输出字符串
- reactjs - 在另一个组件中导入的组件未显示 - Reactjs