Java имеет convienient System.getProperty("user.home")
, чтобы получить "домашний" каталог пользователя не зависящим от платформы способом. Что эквивалентно в Ruby? У меня нет окна Windows, с которым можно поиграть, и я чувствую, что полагаться на тильды в именах файлов - это не самый чистый способ. Существуют ли альтернативы?
Кросс-платформенный способ получения пользовательского домашнего каталога в Ruby?
Ответ 1
Метод File.expand_path
использует соглашение Unix для обработки тильды (~
) специально, так что ~
ссылается на текущий домашний каталог пользователя и ~foo
относится к домашнему каталогу foo
.
Я не знаю, есть ли лучший или более идиоматический способ, но File.expand_path('~')
должен вас поймать.
Ответ 2
С Ruby 1.9 и выше вы можете использовать Dir.home
.
Ответ 3
ENV["HOME"]
или ENV["HOMEPATH"]
должен предоставить вам то, что вы хотите.
homes = ["HOME", "HOMEPATH"]
realHome = homes.detect {|h| ENV[h] != nil}
if not realHome
puts "Could not find home directory"
end
Ответ 4
На платформах unix (linux, OS X и т.д.), ENV["HOME"]
, File.expandpath('~')
или Dir.home
все полагаются на переменную среды HOME
. Но иногда вы обнаружите, что переменная среды не задана - это обычное явление, если вы работаете с запуском script или с некоторыми планировщиками пакетов. Если вы находитесь в этой ситуации, вы можете получить правильный домашний каталог через:
require 'etc'
Etc.getpwuid.dir
Сказав это, поскольку этот вопрос требует метода "кросс-платформенной", следует отметить, что это не будет работать в Windows (Etc.getpwuid
вернет nil
там.) В Windows ENV["HOME"]
и упомянутые выше методы, которые полагаются на него, будут работать, несмотря на то, что переменная HOME
не будет обычно установлена в Windows - при запуске Ruby заполнит ENV["HOME"]
на основе переменных окружения windows HOMEPATH
и HOMEDRIVE
. Если переменные окружения windows HOMEDRIVE
и HOMEPATH
не установлены, это не сработает. Я не знаю, насколько распространено это на самом деле в средах Windows, и я не знаю никакой альтернативы, которая работает в Windows.