打印 perl 脚本的路径而不解析符号链接



如何打印脚本的目录路径而不解析符号链接?

编辑:我从下面的评论中意识到,使用FindBin是不可能的,但是有一种方法可以获得脚本的目录吗?

use FindBin;
use Cwd;
use Cwd 'abs_path';
use File::Spec::Functions qw( rel2abs );
BEGIN
{
   push @INC, "$FindBin::Bin";
}
print "rel2abs:";
print rel2abs("$FindBin::Bin");
print "n";
print "abs_path:";
print abs_path("$FindBin::Bin");
print "n";

这个脚本打印:

/tmp/one/two$ perl 3/symlink_to_four/test.pl 
rel2abs:/tmp/one/two/3/four
abs_path:/tmp/one/two/3/four

我想打印/tmp/one/two/3/symlink_to_four

 /tmp/one/two/3$ ls -l
 four
 symlink_to_four -> four

为什么我需要这个:如果我用\linux-machine-name替换Linux路径的第一部分,samba是在我的Perl脚本将要运行的Linux机器中配置的和其他/ ,得到windows路径,我将它保存在一个文件中,并将会被其他的脚本,例如,在上面的例子中,我试图把/tmp/one/two/3/symlink_to_four \linux-machine-nameonetwo3symlink_to_four,我知道如何找出linux-machine-name,我不想解决路径,因为我不能算出windows等效路径与解决路径,只有\linux-machine-nameonetwo3symlink_to_four有效,不是\linux-machine-nameonetwo3four,而是如何配置samba。

如果我理解正确的话,你可以使用Path::Tiny:

#!/usr/bin/perl
use strict;
use warnings;
use Path::Tiny;

my $path =  path(__FILE__);
print $path->absolute->parent, "n";

Path::Tiny的realpath方法可以解析符号链接,但absolute方法不能。

__FILE__是一个特殊的令牌,它解析为包含它的Perl源文件的名称(可以是主脚本,也可以是它加载的模块)。您也可以使用$0,这是正在执行的脚本的名称。这两个路径可以是绝对路径,也可以是相对路径,具体取决于脚本是使用相对路径还是绝对路径调用的。

如果你的脚本总是用绝对路径调用,那么你可以只使用$0,而不需要额外的模块。

使用Cwd::abs_path获取绝对路径。Cwd是一个核心模块,所以你不需要安装任何额外的东西。

use Cwd qw(abs_path);
my $absolute_path = abs_path (readlink $link);
https://www.perlmonks.org/?node_id=977420

最新更新