如何使用 launchd 的 WatchPaths 保持两个文件同步

如何使用 launchd 的 WatchPaths 保持两个文件同步

背景:Mac OS X plist 格式默认为二进制,这对于使用 git 进行跟踪等操作来说不是很好。有一个命令plutil -convert可以将二进制和 XML 相互转换,但似乎无法强制给定的 plist 文件保持为 XML。

我的想法是使用 launchd WatchPaths 功能来设置两个脚本,一个脚本将二进制文件更改~/Library/Preferences为我的 git repo 中的 XML 文件,另一个脚本在 XML 版本发生变化时将二进制文件转换回来(我需要第二个方向因为我打算用它来在两台计算机之间同步这两个文件)。

唯一的问题是,如果我只是天真地设置它,它将无休止地运行,因为一旦二进制文件发生变化,它就会更新 XML 文件,但这将是对 XML 文件的更改,从而导致它更新二进制文件,依此类推。

有没有一种巧妙的方法可以避免这种循环。我想我要做的是在从二进制转换为 XML 的脚本中检查最后写入文件的东西是否是首选项文件所针对的程序,或者是脚本本身,如果是后者,则不要运行。我是否可以在文件上放置某种属性来告诉它这一点,当普通程序写入文件时,该属性将被清除?

答案1

显然,至少对于我一直在测试的一个程序来说,如果您用来xattr -w在文件上添加属性,则当首选项发生更改时,该属性将被删除,这可能是因为它写出了一个全新的文件。

相关内容