Подтвердить что ты не робот

Кросс-платформенный способ получения пользовательского домашнего каталога в Ruby?

Java имеет convienient System.getProperty("user.home"), чтобы получить "домашний" каталог пользователя не зависящим от платформы способом. Что эквивалентно в Ruby? У меня нет окна Windows, с которым можно поиграть, и я чувствую, что полагаться на тильды в именах файлов - это не самый чистый способ. Существуют ли альтернативы?

4b9b3361

Ответ 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.