Ruby: Finding the absolute path of running script

I needed to use the full/absolute path of the script/program to a library for access control. I had not done something like this before so here is my trail of discovery:

$0

I started with $0, which in ruby is one of those magic variables that contain the name of the program that was executed from the command line.

The problem with $0 is that it does not necessary have the absolute path, it has whatever the user used which could be relative or absolute.

__FILE__

Then I found __FILE__ which was not exactly what I was looking for as it would give you the file name of the current file so when executing library routine it would be the name of the library file not the original executable file that the user ran.

File.expand_path

After some research I found File.expand_path which essentially did the trick if you use it with $0. So File.expand_path $0 would give you the absolute path of the calling program.

Pathname.new.realpath.to_s

On a parallel note I found Pathname.new.realpath.to_s also but that require you to require ‘pathname’ and also it resolved a symbolic link to real path which was not desired in my case.

Dir.chdir

One caveat with File.expand_path which an experienced rubyist pointed out that if a script does a Dir.chdir then File.expand_path would not work as it essentially prepends the cwd (current working directory) to $0 but even the fellow rubyist couldn’t think of a better way to do this so File.expand_path was my eventual solution and it works!