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

时间:2010-03-24 00:39:54

标签: ruby

如果文件存在,则以下Errno::ENOENT: No such file or directory失败:

open('~/some_file')

但是,我可以这样做:

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

我有两个问题:

  1. 为什么open不会将波形符处理为指向主目录?
  2. 是否比File.expand_path更加流畅?

4 个答案:

答案 0 :(得分:113)

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

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

答案 1 :(得分:101)

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

    open(ENV['HOME']+'/some_file')
    
  3. 我希望它足够光滑。我个人认为使用环境变量在语义上比使用expand_path更清晰。

答案 2 :(得分:12)

您可以使用共享网络计算机进行开发,而不是依赖于正确设置的$HOME环境变量,这可能很麻烦:

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

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

答案 3 :(得分:2)

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

从文档文档:

absolute_path(file_name [, dir_string] ) → abs_file_name
  

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