如何打开相对于主目录的文件

Pet*_*ter 88 ruby

Errno::ENOENT: No such file or directory即使文件存在,以下内容也会失败:

open('~/some_file')
Run Code Online (Sandbox Code Playgroud)

但是,我可以这样做:

open(File.expand_path('~/some_file'))
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 为什么不open将波形符处理为指向主目录?
  2. 有比这更光滑的方式File.expand_path吗?

all*_*lar 118

不确定这是否在Ruby 1.9.3之前可用,但我发现最优雅的解决方案是使用Dir.home哪个是核心的一部分.

open("#{Dir.home}/some_file")
Run Code Online (Sandbox Code Playgroud)

  • 不,不适用于1.9.3以下的用户(http://apidock.com/ruby/v1_9_2_180/Dir/home/class). (2认同)

Roa*_*ter 105

  1. shell(bash,zsh等)负责通配符扩展,所以在你的第一个例子中没有shell,因此没有扩展.使用波浪号指向$HOME仅仅是一种惯例; 实际上,如果你查看文档File.expand_path,它会正确解释波浪号,但它是函数本身的一个特征,而不是底层系统固有的东西; 此外,还File.expand_path需要$HOME正确设置环境变量.这带给我们可能的选择......
  2. 试试这个:

    open(ENV['HOME']+'/some_file')
    
    Run Code Online (Sandbox Code Playgroud)

我希望它足够光滑.我个人认为使用环境变量在语义上比使用更清晰expand_path.

  • 简单地使用`File.join(ENV ['HOME'],'/ some_file')`使它在两种情况下都能正常工作. (7认同)

Vok*_*oro 12

$HOME您可以使用以下命令从Ruby获取此信息,而不是依赖于正确设置的环境变量(这可能是您使用共享网络计算机进行开发时的麻烦).

require 'etc'
open ("#{Etc.getpwuid.dir}/some_file")
Run Code Online (Sandbox Code Playgroud)

我相信这可以识别当前登录的用户并获取其主目录,而不是依赖于$HOME所设置的全局环境变量.这是我认为的上述替代解决方案.