Finding path to ruby script argument

When I execute a ruby script by the following:

ruby <path>helloworld.rb onlyarg

How can I find what <path> equals?

For example, in Windows, ruby C:\scripts\helloworld.rb onlyarg

helloworld.rb:

···

----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts ARGV[0]
----------------------------------------------

output:
----------------------------------------------
onlyarg
----------------------------------------------

Thanks!

Matthew

The constant __FILE__ will contain the full path to the currently
executing file.

Justin

···

On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:

When I execute a ruby script by the following:

ruby <path>helloworld.rb onlyarg

How can I find what <path> equals?

When I execute a ruby script by the following:

ruby <path>helloworld.rb onlyarg

How can I find what <path> equals?

$0 will give you the full string... then use chop it up using dirname to get the directory...

% cat foo.rb
puts File.dirname($0)
% ruby /Users/philip/foo.rb
/Users/philip

···

For example, in Windows, ruby C:\scripts\helloworld.rb onlyarg

helloworld.rb:
----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts ARGV[0]
----------------------------------------------

output:
----------------------------------------------
onlyarg
----------------------------------------------

Thanks!

Matthew

ruby C:\scripts\helloworld.rb

helloworld.rb:

···

----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts $0
puts _FILE_
puts ARGV[0]
----------------------------------------------

output:
----------------------------------------------
C:/scripts/helloworld.rb
C:/scripts/helloworld.rb:3: undefined local variable or method
`_FILE_' for main:Object (NameError)
----------------------------------------------

ruby C:\scripts\helloworld.rb

helloworld.rb:
----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts $0
puts ARGV[0]
----------------------------------------------

output:
----------------------------------------------
C:/scripts/helloworld.rb
onlyarg

----------------------------------------------

I found the $0 documented in the
http://www.rubycentral.com/book/rubyworld.html page.

Justin, how would you recommend me using the _FILE_ constant?

Thanks,

Matthew

On 1/11/07, Justin Bailey <jgbailey@gmail.com> wrote:

On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:
> When I execute a ruby script by the following:
>
> ruby <path>helloworld.rb onlyarg
>
> How can I find what <path> equals?

The constant __FILE__ will contain the full path to the currently
executing file.

Justin

"Justin Bailey" <jgbailey@gmail.com> writes:

When I execute a ruby script by the following:

ruby <path>helloworld.rb onlyarg

How can I find what <path> equals?

The constant __FILE__ will contain the full path to the currently
executing file.

s/constant/keyword/

···

On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:

Justin

--
Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org

Excellent! Thanks.

···

On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:

ruby C:\scripts\helloworld.rb

helloworld.rb:
----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts $0
puts _FILE_
puts ARGV[0]
----------------------------------------------

output:
----------------------------------------------
C:/scripts/helloworld.rb
C:/scripts/helloworld.rb:3: undefined local variable or method
`_FILE_' for main:Object (NameError)
----------------------------------------------

ruby C:\scripts\helloworld.rb

helloworld.rb:
----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts $0
puts ARGV[0]
----------------------------------------------

output:
----------------------------------------------
C:/scripts/helloworld.rb
onlyarg

----------------------------------------------

I found the $0 documented in the
http://www.rubycentral.com/book/rubyworld.html page.

Justin, how would you recommend me using the _FILE_ constant?

Thanks,

Matthew

On 1/11/07, Justin Bailey <jgbailey@gmail.com> wrote:
> On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:
> > When I execute a ruby script by the following:
> >
> > ruby <path>helloworld.rb onlyarg
> >
> > How can I find what <path> equals?
>
> The constant __FILE__ will contain the full path to the currently
> executing file.
>
> Justin
>

Matthew Hailstone wrote:

ruby C:\scripts\helloworld.rb

helloworld.rb:
----------------------------------------------
# What can I put here to display the value C:\scripts\ or C:\scripts?
puts $0
puts _FILE_

There should be two underscores on each side of __FILE__, as the
original poster had it.

Looks like __FILE__ and $0 are the same.

Thanks for the clarification on __FILE__,

Matthew

···

On 1/11/07, Phrogz <gavin@refinery.com> wrote:

Matthew Hailstone wrote:
> ruby C:\scripts\helloworld.rb
>
> helloworld.rb:
> ----------------------------------------------
> # What can I put here to display the value C:\scripts\ or C:\scripts?
> puts $0
> puts _FILE_

There should be two underscores on each side of __FILE__, as the
original poster had it.

Not necessarily... when running a script under rcov or similar, they
may differ (for example one starts with ./ while the other does not).
That's why I write the if __FILE__ == $0 idiom as

if File.expand_path(__FILE__) == File.expand_path($0)

Another possibility might be is when you start the script using $PATH,
i.e. not from current directory, but without specifying its path.

···

On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:

Looks like __FILE__ and $0 are the same.

Also, and i haven't even bothered to test this, but if it's similar to PHP's FILE variable, it's the *current* file... so require a file, call a method in that file, and access __FILE__ in that method and you're gonna get your required file, not the initial one...

-philip

···

On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:

Looks like __FILE__ and $0 are the same.

Not necessarily... when running a script under rcov or similar, they
may differ (for example one starts with ./ while the other does not).
That's why I write the if __FILE__ == $0 idiom as

if File.expand_path(__FILE__) == File.expand_path($0)

Another possibility might be is when you start the script using $PATH,
i.e. not from current directory, but without specifying its path.

helloworld.rb:

···

------------------------------
puts $0
puts __FILE__
puts File.dirname($0)
puts ARGV[0]
puts File.expand_path(__FILE__)
puts File.expand_path($0)

require 'includeme.rb'

tempvar = IncludeMe.new
tempvar.runme
------------------------------

includeme.rb:
------------------------------
class IncludeMe
  def runme
    puts "includeme.rb"
    puts __FILE__
    puts $0
    puts "end includeme.rb"
  end
end
------------------------------

command:
------------------------------
ruby helloworld.rb onlyarg
------------------------------

output:
------------------------------
helloworld.rb
.
onlyarg
C:/scripts/helloworld.rb
includeme.rb
./includeme.rb
helloworld.rb
end includeme.rb

------------------------------

Looks like out of the originally invoked rb script, the whole path is
lost. I would have to assign the value to a global variable if I
needed to preserve it to all scripts.

Matthew

On 1/11/07, Philip Hallstrom <ruby@philip.pjkh.com> wrote:

> On 1/11/07, Matthew Hailstone <matthew.hailstone@gmail.com> wrote:
>> Looks like __FILE__ and $0 are the same.
>
> Not necessarily... when running a script under rcov or similar, they
> may differ (for example one starts with ./ while the other does not).
> That's why I write the if __FILE__ == $0 idiom as
>
> if File.expand_path(__FILE__) == File.expand_path($0)
>
> Another possibility might be is when you start the script using $PATH,
> i.e. not from current directory, but without specifying its path.

Also, and i haven't even bothered to test this, but if it's similar to
PHP's FILE variable, it's the *current* file... so require a file, call a
method in that file, and access __FILE__ in that method and you're gonna
get your required file, not the initial one...

-philip