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

时间:2010-11-16 03:19:59

标签: ruby cross-platform

Java有一个方便的System.getProperty("user.home")以独立于平台的方式获取用户的“home”目录。 Ruby中的等价物是什么?我没有Windows框可以玩,我觉得依靠文件名中的波浪号并不是最干净的方式。还有其他选择吗?

5 个答案:

答案 0 :(得分:97)

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

答案 1 :(得分:82)

File.expand_path方法使用特殊处理波形符(~)的Unix约定,以便~引用当前用户的主目录,~foo引用{ {1}}的主目录。

我不知道是否有更好或更惯用的方式,但foo应该让你去。

答案 2 :(得分: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

答案 3 :(得分:10)

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

require 'etc'
Etc.getpwuid.dir

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

答案 4 :(得分:3)

这适用于所有操作系统

  • 对于当前用户
Dir.home
  • 对于给定的用户
Dir.home('username')

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