为什么bash在Sublime或TextEdit中打开文件时不打开文件描述符,而在BBEdit中打开文件描述符?



我创建了一个名为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需要指定确切的进程名。

相关内容

  • 没有找到相关文章

最新更新