我有一个手动编辑的文件(在终端窗口中使用 emacs)。我有一个脚本,然后读取文件,检查文件是否有错误,并通过按字母顺序对列表进行排序等操作来修改文件。在运行脚本之前,我总是想保存文件并退出编辑器,否则编辑器中未保存的更改与脚本所做的更改之间可能会发生冲突。
在Linux上,一个程序是否可以判断另一个程序是否以读写模式打开了一个文件?在这种情况下,我希望脚本抛出错误并退出。
如果没有,那么我可以考虑更复杂的解决方案,例如编写一个脚本作为 emacs 的包装器,当 emacs 看到它正在编辑这个特殊文件时,它会创建一个信号量文件。 (无论如何,我通常通过别名调用 emacs。)
[编辑] 我找到了一个适合我的解决方案,即利用 emacs 自动创建不可见信号量文件的事实。我本想删除这个问题,但 SE 界面似乎不允许我这样做。人们还可以从命令行显式使用flock(例如,flock a.a /bin/emacs -nw a.a
)来获取咨询锁。
答案1
在Linux上,一个程序是否可以判断另一个程序是否以读写模式打开了一个文件?在这种情况下,我希望脚本抛出错误并退出。
您可以检查进程拥有的文件句柄。然而,“打开”是一个有点模糊的术语:要显示文件并编辑它,您只需打开文件,读取其内容,然后再次关闭文件句柄。所以,不,另一个程序不能合理地假设另一个面向用户的程序已打开的内容,因为这不是一个固定的概念。
你的用例听起来像是你要么
- 希望您的编辑器在保存后自动启动外部程序,然后重新读取文件
- 确保您的编辑器自动注意到文件更改(emacs 在许多情况下都会这样做)
- 或者相反,使您的外部程序能够监视正在更改的文件
最后一种是可能的——您可以fanotify
在现代 Linux 和inotify
任何 Linux 上使用(基本上永远是 Linux 2.6.13)。但是:仅靠 Shell 脚本无法做到这一点。您需要使用一种可以从内核获取这些通知的语言。例如,您可以使用该pyinotify
程序(我不喜欢这样,它不能很好地处理名称中带有空格的文件),或者pyinotify
在 python 程序中用作库。对于 C++、C 和所有系统语言,有直接调用fanotify
和inotify
通过 C API 调用。