SPUG: finding directory of script

Richard Anderson richard at richard-anderson.org
Fri Feb 15 00:43:51 CST 2002


FindBin is the way to go.  Scott's and dancerboy's code fails when the
script is invoked using a relative pathname, e.g., cd $HOME;
bin/myscript.pl.  You could try further hacking on $0, e.g.

use Cwd;
($dir = $0) =~ s,(.*)/[^/]+$,$1,;
unless ($dir =~ /^\//) {
    $dir = getcwd() . '/' . $dir;          # Prefix current working
directory to relative pathname
    $dir =~ s/\/\.$//;                         # Strip trailing /.
    $dir =~ s#/\.\./#/#g;                   # Not necessary, but
aesthetically better
}

but this flunks on Windows and other OSes.  Use FindBin.

Cheers,
Richard
richard at richard-anderson.org
www.richard-anderson.org
www.raycosoft.com
----- Original Message -----
From: "dancerboy" <dancerboy at strangelight.com>
To: "Scott Blachowicz" <scott at mail.dsab.rresearch.com>; "Daryn Nakhuda"
<daryn at marinated.org>
Cc: <spug-list at pm.org>
Sent: Thursday, February 14, 2002 8:23 PM
Subject: Re: SPUG: finding directory of script


> At 7:24 pm -0800 2/14/02, Scott Blachowicz wrote:
> >On Thu, Feb 14, 2002 at 06:12:05PM -0800, Daryn Nakhuda wrote:
> >>
> >>  Is there a best way to get the directory containing the script
> >>  you're running? or a way to use relative paths from that
> >>  directory to read files?
> >>
> >>  1. pwd,cwd both return the directory you're running the script from
> >>  (working directory), not where it lives.
> >>
> >>  2. using ./ or ../ is going to be relative to the working dir, not the
> >>  script's dir
> >>
> >>  3. $0 could be used, but you'd have to parse for a ./ or no /, and in
> >>  those cases use the working dir.
> >>
> >>  I don't mind using #3, that would always work, right?
>
>
> You might also want to take a look at the standard FindBin module,
> which is supposed to do what you're trying to do (though IME it's not
> quite as robust as it should be: e.g. it never seems to get the paths
> right when my scripts are run as CGI...)
>
>
> >       (my $dir = $0) =~ s,(.*)/[^/]+$,$1,;
>
> A little verbose, isn't this?  Wouldn't
>
>          (my $dir = $0) =~ s,/[^/]+$,,;
>
> do exactly the same thing, with less work?  (And personally, I find
> the shorter version easier to read...)
>
> -jason
>
>  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>      POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
>       Subscriptions; Email to majordomo at pm.org:  ACTION  LIST  EMAIL
>   Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
>  For daily traffic, use spug-list for LIST ;  for weekly, spug-list-digest
>      Seattle Perl Users Group (SPUG) Home Page: http://seattleperl.org
>
>
>


 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
      Subscriptions; Email to majordomo at pm.org:  ACTION  LIST  EMAIL
  Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
 For daily traffic, use spug-list for LIST ;  for weekly, spug-list-digest
     Seattle Perl Users Group (SPUG) Home Page: http://seattleperl.org





More information about the spug-list mailing list