Search code examples
perlpathlocation

How do I get the full path to a Perl script that is executing?


I have Perl script and need to determine the full path and filename of the script during execution. I discovered that depending on how you call the script $0 varies and sometimes contains the fullpath+filename and sometimes just filename. Because the working directory can vary as well I can't think of a way to reliably get the fullpath+filename of the script.

Anyone got a solution?


Solution

  • There are a few ways:

    • $0 is the currently executing script as provided by POSIX, relative to the current working directory if the script is at or below the CWD
    • Additionally, cwd(), getcwd() and abs_path() are provided by the Cwd module and tell you where the script is being run from
    • The module FindBin provides the $Bin & $RealBin variables that usually are the path to the executing script; this module also provides $Script & $RealScript that are the name of the script
    • __FILE__ is the actual file that the Perl interpreter deals with during compilation, including its full path.

    I've seen the first three ($0, the Cwd module and the FindBin module) fail under mod_perl spectacularly, producing worthless output such as '.' or an empty string. In such environments, I use __FILE__ and get the path from that using the File::Basename module:

    use File::Basename;
    my $dirname = dirname(__FILE__);