我需要找到当前正在运行的Perl脚本的完整路径,例如
对于~/dir/my.pl,我需要它是“/home/user/dir/my.pl”。
$0
将给我“~/dir/my.pl”。对于./my.pl,我仍然需要“/home/user/dir/my.pl”
等等。谢谢!
我需要找到当前正在运行的Perl脚本的完整路径,例如
对于~/dir/my.pl,我需要它是“/home/user/dir/my.pl”。$0
将给我“~/dir/my.pl”。
对于./my.pl,我仍然需要“/home/user/dir/my.pl”
等等。谢谢!
$ cat /tmp/foo/bar/baz/quux/prog
#! /usr/bin/perl
use FindBin;
print "$FindBin::Bin/$FindBin::Script\n";
$ PATH=/tmp/foo/bar/baz/quux prog
/tmp/foo/bar/baz/quux/prog
$ cd /tmp/foo/bar/baz/quux
$ ./prog
/tmp/foo/bar/baz/quux/prog
看起来你正在寻找File::Spec中的rel2abs函数。例如:
#!/usr/bin/perl
use File::Spec;
my $location = File::Spec->rel2abs($0);
print "$location\n";
$ ./myfile.pl
/Users/myname/myfile.pl
$ ~/myfile.pl
/Users/myname/myfile.pl
或者,您可以以完全相同的方式使用Cwd::abs_path。
看起来你只需要将路径扩展为它们的绝对值。查看这篇文章了解如何做到这一点。
如果文件本身是符号链接,许多提到的概念都会失效。我通常以以下方式启动我的脚本:
use strict;
use English;
use warnings;
use Cwd qw(realpath);
use File::Basename;
use lib &File::Basename::dirname(&Cwd::realpath($PROGRAM_NAME));
希望这能有所帮助。
/bin/script.pl -> ~/scripts/script.pl,那么在执行script.pl之后,$FindBin::Bin包含的是/bin而不是~/scripts/。你需要使用&File::Basename::dirname($Cwd::realpath($0))来获取脚本的真正父目录。 - Jiri Klouda