ruby

How to open files relative to home directory


The following fails with Errno::ENOENT: No such file or directory, even if the file exists:

open('~/some_file')

However, I can do this:

open(File.expand_path('~/some_file'))

I have two questions:

  1. Why doesn't open process the tilde as pointing to the home directory?
  2. Is there a slicker way than File.expand_path?

Solution

    1. The shell (bash, zsh, etc) is responsible for wildcard expansion, so in your first example there's no shell, hence no expansion. Using the tilde to point to $HOME is a mere convention; indeed, if you look at the documentation for File.expand_path, it correctly interprets the tilde, but it's a feature of the function itself, not something inherent to the underlying system; also, File.expand_path requires the $HOME environment variable to be correctly set. Which bring us to the possible alternative...
    2. Try this:

      open(ENV['HOME']+'/some_file')
      

    I hope it's slick enough. I personally think using an environment variable is semantically clearer than using expand_path.