difference between $0 and __FILE__

U

Une Bévue

i have a script in my HOME/bin :

/Users/yt/bin/path_test.rb

my "HOME/bin" is in the PATH

then, if from this script, i outputs $0 and __FILE__

with :

path_test.rb i got :
$0 = /Users/yt/bin/path_test.rb
__FILE__ = /Users/yt/bin/path_test.rb


and the same outputs with :
/Users/yt/bin/path_test.rb

why do i have the same outputs in this case ?

in fact i'm looking that because i do have Ruby class extension in a
subfolder of "HOME/bin", namely :
HOME/bin/ruby_ext
where i put my extension for classes of which i could require :
require "#{File.dirname($0)}/ruby_ext/ansi_color"

what's the best way to require in that case, does i need an "absolute
path (starting from / ) or not ?
 
R

Robert Klemme

i have a script in my HOME/bin :

/Users/yt/bin/path_test.rb

my "HOME/bin" is in the PATH

then, if from this script, i outputs $0 and __FILE__

with :

path_test.rb i got :
$0 = /Users/yt/bin/path_test.rb
__FILE__ = /Users/yt/bin/path_test.rb


and the same outputs with :
/Users/yt/bin/path_test.rb

why do i have the same outputs in this case ?

Because the shell will also expand full names. How does your PATH look
like? I assume you set something like PATH="${PATH}:${HOME}/bin" - in
that case you'll have the absolute path to ~/bin in your PATH and
consequently the script is invoked with absolute path.
in fact i'm looking that because i do have Ruby class extension in a
subfolder of "HOME/bin", namely :
HOME/bin/ruby_ext
where i put my extension for classes of which i could require :
require "#{File.dirname($0)}/ruby_ext/ansi_color"

what's the best way to require in that case, does i need an "absolute
path (starting from / ) or not ?

IMHO the best way is to define a local location of library files and set
RUBYLIB to that directory (I use "$HOME/lib/ruby" for that because I
prefer to have lib code separate from programs, but in your case you
could also use "$HOME/bin").

If you want to do it on a per script basis you could do this at the
beginning of your script (i.e. before any requires):

$:.unshift "/your/folder/here"

Kind regards

robert
 
U

Une Bévue

Robert Klemme said:
Because the shell will also expand full names. How does your PATH look
like? I assume you set something like PATH="${PATH}:${HOME}/bin" - in
that case you'll have the absolute path to ~/bin in your PATH and
consequently the script is invoked with absolute path.


OK, i see.
IMHO the best way is to define a local location of library files and set
RUBYLIB to that directory (I use "$HOME/lib/ruby" for that because I
prefer to have lib code separate from programs, but in your case you
could also use "$HOME/bin").

If you want to do it on a per script basis you could do this at the
beginning of your script (i.e. before any requires):

$:.unshift "/your/folder/here"

fine thanks !
 

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

Forum statistics

Threads
473,997
Messages
2,570,241
Members
46,832
Latest member
UtaHetrick

Latest Threads

Top