Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"which in ruby": Checking if program exists in $PATH from ruby

Tags:

path

unix

ruby

my scripts rely heavily on external programs and scripts. I need to be sure that a program I need to call exists. Manually, I'd check this using 'which' in the commandline.

Is there an equivalent to File.exists? for things in $PATH?

(yes I guess I could parse %x[which scriptINeedToRun] but that's not super elegant.

Thanks! yannick


UPDATE: Here's the solution I retained:

 def command?(command)        system("which #{ command} > /dev/null 2>&1")  end 

UPDATE 2: A few new answers have come in - at least some of these offer better solutions.

Update 3: The ptools gem has adds a "which" method to the File class.

like image 396
Yannick Wurm Avatar asked Jan 21 '10 11:01

Yannick Wurm


2 Answers

True cross-platform solution, works properly on Windows:

# Cross-platform way of finding an executable in the $PATH. # #   which('ruby') #=> /usr/bin/ruby def which(cmd)   exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']   ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|     exts.each do |ext|       exe = File.join(path, "#{cmd}#{ext}")       return exe if File.executable?(exe) && !File.directory?(exe)     end   end   nil end 

This doesn't use host OS sniffing, and respects $PATHEXT which lists valid file extensions for executables on Windows.

Shelling out to which works on many systems but not all.

like image 95
mislav Avatar answered Sep 20 '22 09:09

mislav


Use find_executable method from mkmf which is included to stdlib.

require 'mkmf'  find_executable 'ruby' #=> "/Users/narkoz/.rvm/rubies/ruby-2.0.0-p0/bin/ruby"  find_executable 'which-ruby' #=> nil 
like image 37
NARKOZ Avatar answered Sep 18 '22 09:09

NARKOZ