Peter Peter - 7 months ago 49
Ruby Question

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
    ?


Answer
  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.