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

问题描述 投票:0回答:4

即使文件存在,以下操作也会失败并显示

Errno::ENOENT: No such file or directory

open('~/some_file')

但是,我可以这样做:

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

我有两个问题:

  1. 为什么
    open
    不将波形符处理为指向主目录?
  2. 还有比
    File.expand_path
    更巧妙的方法吗?
ruby
4个回答
140
投票

使用

Dir.home
,它是 Ruby 自 1.9.3 以来核心的一部分

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

115
投票
  1. shell(bash、zsh 等)负责通配符扩展,因此在第一个示例中没有 shell,因此没有扩展。使用波浪号来指向
    $HOME
    只是一种惯例;事实上,如果您查看
    File.expand_path
    的文档,它会正确解释波浪号,但它是函数本身的一个功能,而不是底层系统固有的功能;此外,
    File.expand_path
    需要正确设置
    $HOME
    环境变量。这给我们带来了可能的替代方案......
  2. 试试这个:

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

我希望它足够光滑。我个人认为使用环境变量在语义上比使用

expand_path
更清晰。


14
投票

您可以使用以下方法从 Ruby 获取此信息,而不是依赖于正确设置的

$HOME
环境变量(当您使用共享网络计算机进行开发时这可能会很麻烦):

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

我相信这可以识别当前登录的用户并获取他们的主目录,而不是依赖于设置的全局

$HOME
环境变量。我认为这是上述解决方案的替代解决方案。


2
投票

我发现了波形符问题,并创建了一个补丁来添加

absolute_path
它将波形符视为普通字符。

来自文件文档:

absolute_path(file_name [, dir_string] ) → abs_file_name

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

© www.soinside.com 2019 - 2024. All rights reserved.