Forum: Ruby getting rid of $0

Da57cffaec80533bee0d0446b3ea6fcd?d=identicon&s=25 Michel Demazure (Guest)
on 2007-07-02 19:59
The common idiom
 if __FILE__ == $0 then ...
gives bugs when $0 is not what one would expect, for instance under a
debugger, or in rubyscript2exe, etc.

There should be a primitive test
   if <nice name to be found> then...
4d5b5dd4e263d780a5dfe7ac8b8ac98c?d=identicon&s=25 Tim Pease (Guest)
on 2007-07-02 20:10
(Received via mailing list)
On 7/2/07, Michel Demazure <michel@demazure.com> wrote:
> The common idiom
>  if __FILE__ == $0 then ...
> gives bugs when $0 is not what one would expect, for instance under a
> debugger, or in rubyscript2exe, etc.
>
> There should be a primitive test
>    if <nice name to be found> then...
>

require 'English'

if __FILE__ == $PROGRAM_NAME
  ...
end


Blessings,
TwP
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (regularfry)
on 2007-07-02 20:12
(Received via mailing list)
Tim Pease wrote:
> require 'English'
>
> if __FILE__ == $PROGRAM_NAME
>  ...
> end
>
Does that solve the problem?  Isn't that vulnerable to the same issues
as just using $0?
4d5b5dd4e263d780a5dfe7ac8b8ac98c?d=identicon&s=25 Tim Pease (Guest)
on 2007-07-02 20:22
(Received via mailing list)
On 7/2/07, Alex Young <alex@blackkettle.org> wrote:
> >
> > require 'English'
> >
> > if __FILE__ == $PROGRAM_NAME
> >  ...
> > end
> >
> Does that solve the problem?  Isn't that vulnerable to the same issues
> as just using $0?
>

You're correct! That does not solve the problem. :/

Hmmm ... the solution I use most often is to have a top-level function
that runs the application.  This top-level function is called by a
separate Ruby script.


class MyApp
  def self.run( args )
    new(args).run
  end
  ...
end

And in an executable file called "my_app"

#!/usr/bin/env ruby

require 'MyApp'
MyApp.run ARGV


I try to avoid the __FILE__ == $0 idiom when I distribute code. You
run into the problems the original poster pointed out, and rubygems
also wrappers up all your executables with it's own special calling
semantics (provides compatibility between windows / *nix).

Not the answer you want to hear, but, "don't do that".  Sorry :/

TwP
5a837592409354297424994e8d62f722?d=identicon&s=25 Ryan Davis (Guest)
on 2007-07-02 22:48
(Received via mailing list)
On Jul 2, 2007, at 11:11 , Alex Young wrote:

> issues as just using $0?
Solve what problem? The code is doing what you asked it to do, that
isn't a problem, that's programming.

The code clearly reads "if this file is the program" which is NOT the
case when run under a debugger. I'm not sure what rubyscript2exe
generates, but my guess is that can be solved on their end somehow. I
generally don't want that code to run when I'm poking around in a
debugger or something similar. If I do, I set the values inside the
debugger and don't worry about it.
97550977337c9f0a0e1a9553e55bfaa0?d=identicon&s=25 Jano Svitok (Guest)
on 2007-07-02 23:04
(Received via mailing list)
On 7/2/07, Michel Demazure <michel@demazure.com> wrote:
> The common idiom
>  if __FILE__ == $0 then ...
> gives bugs when $0 is not what one would expect, for instance under a
> debugger, or in rubyscript2exe, etc.
>
> There should be a primitive test
>    if <nice name to be found> then...

rcov provides for this case a special switch --replace-progname that
does what the name says. Unfortunately, sometimes there's still a
mismatch between those two:
one is ./something.rb while the other is just something.rb. Therefore
I use the following variation of the idiom (I haven't checked this
under debugger or any other prog):

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

I have posted a patch for ruby-prof that adds a similar switch and it
has been accepted.

Anyway, $0 seems to be a normal variable that you can set to anything
you want, so creating a small wrapper script should not be a problem.
E.g.

$0 = ARGV.shift
require $0
1bac2e65d64faf472cf2ebc94f0f5ee0?d=identicon&s=25 ara.t.howard (Guest)
on 2007-07-03 08:44
(Received via mailing list)
On Jul 2, 2007, at 3:03 PM, Jano Svitok wrote:

> Anyway, $0 seems to be a normal variable that you can set to anything
> you want, so creating a small wrapper script should not be a problem.
> E.g.
>
> $0 = ARGV.shift
> require $0


be careful, $0 is not a normal variable:

cfp:~ > cat a.rb
$0 = 'foobar'

puts `ps wwwaux|grep foobar`


cfp:~ > ruby a.rb
ahoward  10371   2.6 -0.1    29204   1388  p2  S+   12:41AM   0:00.01
foobar
ahoward  10372   1.4 -0.0    27728    584  p2  S+   12:41AM   0:00.00
sh -c ps wwwaux|grep foobar
ahoward  10374   1.2 -0.0    27368    448  p2  S+   12:41AM   0:00.00
grep foobar


it actually assigns to c's argv


-a
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.