在Ruby中获取用户主目录的跨平台方法?

dav*_*000 57 ruby cross-platform

Java具有System.getProperty("user.home")以独立于平台的方式获取用户"home"目录的便利性.Ruby中的等价物是什么?我没有Windows框可以玩,我觉得依靠文件名中的波浪号并不是最干净的方式.还有替代品吗?

Pio*_*ioz 98

使用Ruby 1.9及更高版本,您可以使用Dir.home.

  • 此外,“Dir.home('my_username')”将为您提供特定用户的主目录。 (3认同)

Jör*_*tag 82

File.expand_path方法使用~特殊处理tilde()的Unix约定,以便~引用当前用户的主目录并~foo引用其foo主目录.

我不知道是否有更好或更惯用的方式,但File.expand_path('~')应该让你去.

  • Dir.home在Ruby 1.9中添加.?http://redmine.ruby-lang.org/issues/show/1027 (13认同)
  • 这个页面上的所有内容都有效(至少在Windows 7上),但我认为Dir.home和使用代字号似乎是最好的. (5认同)

Jac*_*kin 10

ENV["HOME"]或者ENV["HOMEPATH"]应该给你你想要的东西.

homes = ["HOME", "HOMEPATH"]

realHome = homes.detect {|h| ENV[h] != nil}

if not realHome
   puts "Could not find home directory"
end
Run Code Online (Sandbox Code Playgroud)


Mic*_*cah 10

在unix平台(linux,OS X等)上ENV["HOME"],File.expandpath('~')或者Dir.home全部依赖于HOME正在设置的环境变量.但有时您会发现环境变量未设置 - 如果您从启动脚本或某些批处理调度程序运行,这种情况很常见.如果您遇到这种情况,您仍然可以通过以下方式获得正确的主目录:

require 'etc'
Etc.getpwuid.dir
Run Code Online (Sandbox Code Playgroud)

话虽如此,由于这个问题要求"跨平台"方法,必须注意这在Windows上不起作用(Etc.getpwuid将返回nil那里.)在Windows上,ENV["HOME"]上面提到的依赖它的方法会起作用,尽管HOME变量不常在Windows上设置 - 在启动时,Ruby将ENV["HOME"]根据窗口HOMEPATHHOMEDRIVE环境变量填写.如果未设置窗口HOMEDRIVEHOMEPATH环境变量,则此操作无效.我不知道在Windows环境中实际上有多常见,我不知道在Windows上有什么替代方案.


KIN*_*BRI 5

这适用于所有操作系统

  • 对于当前用户
Dir.home
Run Code Online (Sandbox Code Playgroud)
  • 对于给定的用户
Dir.home('username')
Run Code Online (Sandbox Code Playgroud)

注意:用户名在Linux上区分大小写,但在Windows或macOS上不区分大小写