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


95

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

open('~/some_file')

但是,我可以这样做:

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

我有两个问题:

  1. 为什么不open将波浪号指向主目录?
  2. 有没有一个比它更好的方式File.expand_path

Answers:


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

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

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


使用Windows ..必须做open(ENV['HOME']+'some_file')
David West

9
只需使用File.join(ENV['HOME'], '/some_file')它即可在两种情况下均起作用。
Marcin Bilski 2015年


12

不用依赖$HOME正确设置环境变量(当您使用共享网络计算机进行开发时可能会很麻烦),您可以使用以下方法从Ruby中获取:

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

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


2

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

从文件文档中:

absolute_path(file_name [, dir_string] )  abs_file_name

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.