Cross-platform means of getting user's home directory in Ruby?

RubyCross Platform

Ruby Problem Overview


Java has the convienient System.getProperty("user.home") to get the user's "home" directory in a platform-independent way. What's the equivalent in Ruby? I don't have a Windows box to play around with, and I feel like relying on tildes in filenames isn't the cleanest way. Are there alternatives?

Ruby Solutions


Solution 1 - Ruby

With Ruby 1.9 and above you can use Dir.home.

Solution 2 - Ruby

The File.expand_path method uses the Unix convention of treating the tilde (~) specially, so that ~ refers to the current user's home directory and ~foo refers to foo's home directory.

I don't know if there's a better or more idiomatic way, but File.expand_path('~') should get you going.

Solution 3 - Ruby

This works on all operating systems

  • For the current user
Dir.home
  • For a given user
Dir.home('username')

Note: Username is case sensitive on Linux but not on Windows or macOS

Solution 4 - Ruby

On unix platforms (linux, OS X, etc), ENV["HOME"], File.expandpath('~') or Dir.home all rely on the HOME environment variable being set. But sometimes you'll find that the environment variable isn't set--this is common if you're running from a startup script, or from some batch schedulers. If you're in this situation, you can still get your correct home directory via the following:

require 'etc'
Etc.getpwuid.dir

Having said that, since this question is asking for a "cross-platform" method it must be noted that this won't work on Windows (Etc.getpwuid will return nil there.) On Windows, ENV["HOME"] and the methods mentioned above that rely on it will work, despite the HOME variable not being commonly set on Windows--at startup, Ruby will fill in ENV["HOME"] based on the windows HOMEPATH and HOMEDRIVE environment variables. If the windows HOMEDRIVE and HOMEPATH environment variables aren't set then this won't work. I don't know how common that actually is in Windows environments, and I don't know of any alternative that works on Windows.

Solution 5 - Ruby

ENV["HOME"] or ENV["HOMEPATH"] should give you what you want.

homes = ["HOME", "HOMEPATH"]

realHome = homes.detect {|h| ENV[h] != nil}

if not realHome
   puts "Could not find home directory"
end

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondavetron5000View Question on Stackoverflow
Solution 1 - RubyPiozView Answer on Stackoverflow
Solution 2 - RubyJörg W MittagView Answer on Stackoverflow
Solution 3 - RubyKING SABRIView Answer on Stackoverflow
Solution 4 - RubyMicahView Answer on Stackoverflow
Solution 5 - RubyJacob RelkinView Answer on Stackoverflow