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

以下Errno::ENOENT: No such file or directory失败Errno::ENOENT: No such file or directory ,即使该文件存在:

 open('~/some_file') 

不过,我可以这样做:

 open(File.expand_path('~/some_file')) 

我有两个问题:

  1. 为什么不open指向主目录的代字符?
  2. 有比File.expand_path吗?

  1. shell(bash,zsh等)负责通配符扩展,所以在第一个例子中没有shell,因此没有扩展。 使用代字号指向$HOME仅仅是一个惯例; 的确,如果你看看File.expand_path的文档,它正确地解释了代字号,但它是函数本身的一个特性,而不是底层系统固有的东西。 另外, File.expand_path需要正确设置$HOME环境variables。 这使我们有可能select…
  2. 尝试这个:

     open(ENV['HOME']+'/some_file') 

我希望它光滑。 我个人认为使用环境variables在语义上比使用expand_path更清晰。

不知道这是否在Ruby 1.9.3之前是可用的,但我发现最优雅的解决scheme是使用Dir.home ,它是核心的一部分。

 open("#{Dir.home}/some_file") 

而不是依赖$HOME环境variables被正确设置,当你使用共享networking计算机进行开发时,这可能是一个麻烦,你可以从Ruby使用:

 require 'etc' open ("#{Etc.getpwuid.dir}/some_file") 

我相信这标识了当前login的用户,并获得他们的主目录,而不是依赖全局的$HOME环境variables被设置。 这是我认为上述替代解决scheme。

我发现了代字号的问题,并创build了一个补丁来添加absolute_path ,将tilde视为普通字符。

从文件文件:

 absolute_path(file_name [, dir_string] ) → abs_file_name 

将path名转换为绝对path名。 相对path是从进程的当前工作目录引用的,除非给出了dir_string,在这种情况下,它将被用作起点。 如果给定的path名​​以“〜”开头,则不会展开,则将其视为正常的目录名称。