【问题标题】:Getting perl's executable absolute path with keeping symlinks通过保留符号链接获取 perl 的可执行绝对路径
【发布时间】:2013-05-04 09:24:42
【问题描述】:

如何获得 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 之类的问题,但没有人给我答案。

【问题讨论】:

    标签: perl


    【解决方案1】:

    建议你试试

    use File::Spec::Functions qw( rel2abs canonpath );
    
    print canonpath(rel2abs($^X));
    

    或者,有

    use Cwd::Ext 'abs_path_nd';
    
    print abs_path_nd($^X);
    

    【讨论】:

    • 使用../../../../../opt/local/bin/perl prg 运行返回/Users/jm/Develop/perl/changesbang/../../../../../opt/local/bin/perl 而不是/opt/local/bin/perl
    • @jm666: 即使通过canonpath?
    • @jm666:我手头没有 Linux 平台,但我在回答中添加了另一个建议。
    • 我目前在 OS X 上,但希望它可移植,以便 nwm。请检查我的代码,Cwd 的 realpath 和 abs_path 已经尝试过了。无论如何,谢谢你的建议:)。
    • 啊,对不起。我现在正确理解你的问题。您需要的是Cwd::Ext 模块。我已经相应地修改了我的答案。
    【解决方案2】:

    如果不解析符号链接,您的要求是不可能正确完成的。

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

    不一定相同

    /opt/local/bin/perl
    

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

    您正试图在您的程序中引入一个错误。

    【讨论】:

    • 在我检查了 Cwd::Ext 的来源(我想要什么)之后,我决定不使用它:)。相反,我窃取并修改了 Cwd::fast_abs_path 以简单地忽略所有符号链接。我明白你的意思,但是对于我的需要是可以(并且希望)忽略符号链接(路径中的任何地方)。当路径的任何部分是符号链接时,脚本更改 shebang 行(在另一个 perl 程序中)和(现在)工作正常。但是,如果你能告诉我任何可能的问题,我会很高兴。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多