我创建了一个名为hello.txt的文件,并执行了:
open hello.txt
文件在文本框中弹出打开。
然后,在一个单独的shell窗口中,我做了:
lsof | grep -i hello
返回无结果
我将文件重命名为hello.cpp,并执行了:
open hello.cpp
它在我默认的文本编辑器sublime中弹出,lsof仍然没有返回任何结果。
现在我将它重命名为hello.log,并再次打开它。它在日志查看器中打开,我使用:BBEdit,这次lsof返回FD:
lsof | grep -i hello
BBEdit 2153 sgupta 16r REG 1,2 9 24415936 /Users/sgupta/Desktop/testarea/hello.log
它是否用其他名称创建FD ?
open命令不是bash的一部分-我认为这是OSX的事情(可能是BSD?)这个问题甚至不是关于打开的,而是关于Sublime和TextEdit与BBEdit如何处理文件。
我能够验证你的结果,并且我相信TextEdit(显然是崇高的,我没有它)不会在你编辑时保持文件打开。我写了一个快速的小ruby脚本(因为它是一种可爱的简单语言)来打开一个文件并保持它打开10秒…
File.open "open.txt", "r" do |f|
sleep 10
end
,我注意到它出现在lsof:
$ lsof open.txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 6531 dfarrell 5r REG 1,4 14 7602637 open.txt
您可能想要考虑使用opensnoop
来监视文件在相关文件上打开时的情况。我发现运行sudo opensnoop | grep TextEdit.*open.txt
效果最好。我们知道,如果打开文件,它显然会将其读入缓冲区,然后在完成读/写操作后再次关闭文件描述符。仅供参考,vim
似乎做同样的事情。
希望有帮助!
除了@DanFarrell的出色回答之外,让我建议使用lsof
与-p
和感兴趣的进程的PID,以便列出指定进程当前打开的所有文件。
例如,列出Sublime Text 2
中当前打开的所有文件,使用:
lsof -p $(pgrep -lx 'Sublime Text 2' | cut -d ' ' -f1)
注意选项-x
需要指定确切的进程名。