Velocity Reviews > Ruby > Separator in $PATH # Separator in$PATH

Stefano Mioli
Guest
Posts: n/a

 10-19-2010
Hello everyone,
Unix-like operating systems use a colon to separate each directory in
the PATH, while Windows uses a semicolon.

The question is: is there some class in the Ruby library that knows
Or do I have to resort to something like the following?

if RUBY_PLATFORM =~ /(win|w)32\$/
# ...
end

I'm asking this question because I need to figure out if a given
executable is in the path and, if it does, retrieve its full path.
So I whipped up this one-liner which seems to work as expected (except
on Windows, of course):

ENV["PATH"].split(":").collect {|p| File.join(p, "foo")}.keep_if{|p|
File.exist? p}.first

where "foo" is the name of the executable.
While we're at it, can someone think of a better / more idiomatic way to
do it?

Obviously, simply trying to run the executable is not an option.

--
Stefano

Daniel Berger
Guest
Posts: n/a

 10-19-2010

On Oct 19, 2:02=A0pm, Stefano Mioli <(E-Mail Removed)> wrote:
> Hello everyone,
> =A0 =A0 =A0 =A0 Unix-like operating systems use a colon to separate each =

directory in
> the PATH, while Windows uses a semicolon.
>
> The question is: is there some class in the Ruby library that knows

File:ATH_SEPARATOR

> I'm asking this question because I need to figure out if a given
> executable is in the path and, if it does, retrieve its full path.

require 'ptools'

File.which('ls') # =3D> '/bin/ls'

Works on Windows, too, with or without an extension:

File.which('notepad.exe') # Also works

Regards,

Dan

Stefano Mioli
Guest
Posts: n/a

 10-19-2010
On Tue, Oct 19, 2010 at 10:08 PM, Daniel Berger <(E-Mail Removed)> wrote:
>
> On Oct 19, 2:02=A0pm, Stefano Mioli <(E-Mail Removed)> wrote:

>> The question is: is there some class in the Ruby library that knows

>
> File:ATH_SEPARATOR
>
>> I'm asking this question because I need to figure out if a given
>> executable is in the path and, if it does, retrieve its full path.

>
> require 'ptools'
>
> File.which('ls') # =3D> '/bin/ls'
>
> Works on Windows, too, with or without an extension:
>
> File.which('notepad') =A0 =A0 # Works
> File.which('notepad.exe') # Also works

Many thanks, Dan.
I didn't know about ptools, and somehow I just saw File::SEPARATOR,
but not File:ATH_SEPARATOR.

--=20
Stefano

Robert Klemme
Guest
Posts: n/a

 10-20-2010
On Wed, Oct 20, 2010 at 9:20 AM, GianFranco Bozzetti
<(E-Mail Removed)> wrote:
> string#split accept a regular expression
>
> path_list = ENV['PATH'].split(/[:;]/) # work s on Linus and Windows
>
> HTH gfb

Well, it works. But it isn't helpful.

irb(main):002:0> 'C:\\foo;W::\\bar'.split(/[:;]/)
=> ["C", "\\foo", "W", "", "\\bar"]

Cheers

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/