# Separator in $PATH Discussion in 'Ruby' started by Stefano Mioli, Oct 19, 2010. 1. ### Stefano MioliGuest 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 about this difference? 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
Stefano Mioli, Oct 19, 2010

2. ### Daniel BergerGuest

On Oct 19, 2:02=A0pm, Stefano Mioli <> 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:

Regards,

Dan
Daniel Berger, Oct 19, 2010

3. ### Stefano MioliGuest

On Tue, Oct 19, 2010 at 10:08 PM, Daniel Berger <> wrote:
>
> On Oct 19, 2:02=A0pm, Stefano Mioli <> 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

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

--=20
Stefano
Stefano Mioli, Oct 19, 2010
4. ### Robert KlemmeGuest

On Wed, Oct 20, 2010 at 9:20 AM, GianFranco Bozzetti
<> 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/
Robert Klemme, Oct 20, 2010