【发布时间】:2019-03-14 11:38:02
【问题描述】:
Java 有方便的System.getProperty("user.home") 以独立于平台的方式获取用户的“主”目录。 Ruby 中的等价物是什么?我没有可以玩的 Windows 框,而且我觉得在文件名中依赖波浪号并不是最干净的方法。有替代品吗?
【问题讨论】:
标签: ruby cross-platform
Java 有方便的System.getProperty("user.home") 以独立于平台的方式获取用户的“主”目录。 Ruby 中的等价物是什么?我没有可以玩的 Windows 框,而且我觉得在文件名中依赖波浪号并不是最干净的方法。有替代品吗?
【问题讨论】:
标签: ruby cross-platform
对于 Ruby 1.9 及更高版本,您可以使用Dir.home。
【讨论】:
Dir.home('my_username') 将为您提供特定用户的主目录。
File.expand_path 方法使用 Unix 约定对波浪号 (~) 进行特殊处理,因此~ 指的是当前用户的主目录,~foo 指的是foo 的主目录。
我不知道是否有更好或更惯用的方式,但File.expand_path('~') 应该可以帮助您。
【讨论】:
这适用于所有操作系统
Dir.home
Dir.home('username')
注意:用户名在 Linux 上区分大小写,但在 Windows 或 macOS 上不区分
【讨论】:
在 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 将根据Windows 的HOMEPATH 和HOMEDRIVE 环境变量填充ENV["HOME"]。如果没有设置 windows HOMEDRIVE 和 HOMEPATH 环境变量,那么这将不起作用。我不知道这在 Windows 环境中实际上有多普遍,而且我不知道有任何替代方法可以在 Windows 上运行。
【讨论】:
ENV["HOME"] 或 ENV["HOMEPATH"] 应该会给你你想要的。
homes = ["HOME", "HOMEPATH"]
realHome = homes.detect {|h| ENV[h] != nil}
if not realHome
puts "Could not find home directory"
end
【讨论】:
HOMEPATH 是仅在 Windows 上的环境变量。
HOMEPATH on Windows 不包括驱动器号 - 如果用户文件夹位于 D: 中,则无法使用。