Linux /MAC 下 vi 或 vim 的编辑再保存改变了文件的什么信息

2022-08-07 11:20:37 +08:00
 choice4
  1. Java 存在一个线程周期性地向目标文件写入内容 OutputStreamWriter(FileOutputStream) , append 模式.
  2. 在过程中(不要求一定在写入中,可以为两个周期的间隔)使用 vi/vim 工具清空文件内容,如ggdG,保存退出.
  3. 此时如果在该终端使用 tail -f 持续输出该文件内容,无法得到任何结果.
  4. 文件清空后,Java 层面断点跟踪可以正常到达 FileOutputStream#writeBytes(byte[], int, int, boolean) 这个 native 方法,参数均正常,也不会抛出异常.
  5. 如果在保存退出该文件前,已经有一个终端被 tail -f 占用,那么这个终端是可以持续收到写入内容的.
  6. 以上现象我目前环境在 Linux/MacOS/Docker In Linux 稳定复现,Windows 暂未发现此问题(也可能是误测).
  7. 若使用 nano 编辑保存,或 > 重定向为空则不会影响目标文件的输出. 基于以上几点我认为可能 vi 或 vim 在保存退出后会影响文件的一些信息,而这些信息在 Linux/Macos 上用于严格区分文件的唯一性。请问有没有人了解这方便的信息? vi 或 vim 保存退出动作额外改变了文件的什么内容呢?
1652 次点击
所在节点    Java
7 条回复
momocraft
2022-08-07 11:42:38 +08:00
影响 inode
vim 保存时会先保存到临时文件再 move

http://vimdoc.sourceforge.net/htmldoc/options.html#'backupcopy'

------

5 为什么能继续 tail 就不知道,可能我没理解
msg7086
2022-08-07 12:35:53 +08:00
@momocraft tail -f 吃的是原来的 inode 呗。
choice4
2022-08-07 12:44:38 +08:00
看起来很大概率是这样的。
dorothyREN
2022-08-07 17:01:15 +08:00
tail -F filename
dorothyREN
2022-08-07 17:01:33 +08:00
@dorothyREN #4 可以用大写的 F 参数
dorothyREN
2022-08-07 17:01:59 +08:00
@dorothyREN #5 看错东西了。。
rev1si0n
2022-08-08 10:20:12 +08:00
好像是会删除重建文件,改变了 inode ,之前吃过这个亏,就是挂载单文件到 docker 上,本地改了以后 docker 里的不会变。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/871208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX