编辑者可以遵循几种策略来保存文件。两个主要变体是覆盖现有文件,或写入新文件并将其移动到位。写入新文件并将其移到原处具有很好的属性,即在任何时间点,从文件读取都会为您提供文件的完整版本(旧文件一个瞬间,新文件一个瞬间)。如果该文件被覆盖到位,则在一段时间内它是不完整的,如果此时有其他程序访问该文件或系统崩溃,则会出现问题。
Nano显然会覆盖现有文件。您的脚本会在完成编写(close_write
事件)时检测到该点并rsync
在该点运行。请注意,如果连续快速保存两次,则rsync可能会捕获文件的不完整版本,直到rsync从第一次保存完成其工作之前。
另一方面,Vim使用“先写后移”策略,这可以达到以下目的:
echo 'new content' >somefile.new
mv -f somefile.new somefile
文件的旧版本会发生什么变化,即在将新版本移到适当位置时将其删除。此时,inotifywait
命令返回,因为已告知要监视的文件不再存在。(新somefile
文件是具有相同名称的另一个文件。)如果已将Vim配置为制作备份文件,则将发生类似
echo 'new content' >somefile.new
ln somefile somefile.old
mv -f somefile.new somefile
并且inotifywait
现在正在监视备份。
有关文件保存策略的更多信息,请参见在程序运行时如何进行实时更新?和文件权限并保存
可以告诉Vim使用覆盖策略:关闭backupcopy
选项(:set nobackupcopy
)。如上所述,这是有风险的。
要处理这两种保存策略,请查看目录并同时过滤close_write
和moved_to
事件somefile
。
inotifywait -m -e close_write,moved_to --format %e/%f . |
while IFS=/ read -r events file; do
if [ "$file" = "somefile" ]; then
…
fi
done