Finding path to ruby script argument

M

Matthew Hailstone

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
 
J

Justin Bailey

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
 
P

Philip Hallstrom

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
 
M

Matthew Hailstone

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
 
M

Matthew Hailstone

Excellent! Thanks.

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

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

Justin
 
M

Matthew Hailstone

Looks like __FILE__ and $0 are the same.

Thanks for the clarification on __FILE__,

Matthew
 
J

Jan Svitok

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.
 
P

Philip Hallstrom

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
 
M

Matthew Hailstone

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top