通过保持符号链接获取perl的可执行绝对路径

时间:2013-05-04 09:24:43

标签: perl

如何获得perl可执行文件的清理绝对路径,但保留符号链接? (来自$^X变量或无论如何)

示例perl可执行文件:

$ ls -l /opt/local/bin/perl
lrwxr-xr-x  1 root  admin  8 18 nov 02:46 /opt/local/bin/perl -> perl5.12

无论我如何运行perl解释器,我都想在我的脚本中获取/opt/local/bin/perl

测试代码(changesbang.pl):

use strict;
use warnings;
use Cwd;
use File::Spec;
use Config;

my $fmt = "%-25s: %s\n";

printf $fmt, "The value of ^X",        $^X;

printf $fmt, "Cwd::realpath",          Cwd::realpath($^X);
printf $fmt, "Cwd::abs_path",          Cwd::abs_path($^X);

printf $fmt, "File::Spec->cannonpath", File::Spec->canonpath($^X);
printf $fmt, "File::Spec->rel2abs",    File::Spec->rel2abs($^X);

printf $fmt, "Config{perlpath}",       $Config{perlpath};

现在以

运行上面的内容
$ ../../../../../opt/local/bin/perl changesbang.pl
The value of ^X          : ../../../../../opt/local/bin/perl
Cwd::realpath            : /opt/local/bin/perl5.12
Cwd::abs_path            : /opt/local/bin/perl5.12
File::Spec->cannonpath   : ../../../../../opt/local/bin/perl
File::Spec->rel2abs      : /Users/jm/Develop/perl/changesbang/../../../../../opt/local/bin/perl
Config{perlpath}         : /opt/local/bin/perl5.12

没人回复我想要的/opt/local/bin/perl

问题是:如何使用约束获取所需的perl可执行路径:

  • 应该清理绝对路径
  • 但如果是符号链接,应该保留它(不要将其更改为目标)

Ps:以下是类似thisthis的问题,但没有人给我答案。

2 个答案:

答案 0 :(得分:2)

我建议你试试

use File::Spec::Functions qw( rel2abs canonpath );

print canonpath(rel2abs($^X));

或者,有

use Cwd::Ext 'abs_path_nd';

print abs_path_nd($^X);

答案 1 :(得分:0)

如果不解析符号链接,你所要求的是不可能做到的。

/a/b/c/d/e/../../../../../opt/local/bin/perl

不一定与

相同
/opt/local/bin/perl

如果abcde中的任何一个是符号链接。这就是canonpath不改变它的原因。

您正在尝试在您的计划中引入错误。