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

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

Ответы [ 5 ]

97 голосов
/ 25 сентября 2011

С Ruby 1.9 и выше вы можете использовать Dir.home.

82 голосов
/ 16 ноября 2010

В методе File.expand_path используется соглашение Unix, предусматривающее специальную обработку тильды (~), поэтому ~ относится к домашнему каталогу текущего пользователя, а ~foo относится к foo домашний каталог.

Я не знаю, есть ли лучший или более идиоматический способ, но File.expand_path('~') должен помочь вам.

10 голосов
/ 02 декабря 2012

На платформах 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"] в зависимости от переменных среды windows HOMEPATH и HOMEDRIVE.Если переменные окружения windows HOMEDRIVE и HOMEPATH не установлены, это не будет работать.Я не знаю, насколько часто это происходит в средах Windows, и я не знаю ни одной альтернативы, которая работает в Windows.

10 голосов
/ 16 ноября 2010

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 голосов
/ 14 марта 2019

Работает во всех операционных системах

  • Для текущего пользователя
Dir.home
  • Для данного пользователя
Dir.home('username')

Примечание: Имя пользователя чувствительно к регистру в Linux, но не в Windows или macOS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...