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

时间:2015-06-03 21:53:46

标签: 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路径的第一部分,那么在我的Perl脚本将要运行的Linux框中配置samba  /\的其余部分,我得到了Windows路径,我会将其保存在一个文件中并被其他脚本使用,例如,在上面的例子中,我试图转换{ {1}}到/tmp/one/two/3/symlink_to_four,我知道如何找出\\linux-machine-name\one\two\3\symlink_to_four,我不想要解析路径,因为我无法弄清楚具有已解析路径的窗口等效路径,只有{{} 1}}有效,而不是linux-machine-name,这是samba的配置方式。

2 个答案:

答案 0 :(得分:1)

如果我正确理解您要实现的目标,可以使用Path::Tiny

alert($('select').find('option:selected').index());

Path :: Tiny的#!/usr/bin/perl use strict; use warnings; use Path::Tiny; my $path = path(__FILE__); print $path->absolute->parent, "\n"; 方法会解析符号链接,但realpath方法却没有。

absolute是一个特殊的标记,它解析为它所包含的Perl源文件的名称(主要脚本或它加载的模块)。您还可以使用__FILE__这是正在执行的脚本的名称。这些中的任何一个都可以是绝对的或相对的,具体取决于脚本是使用相对路径还是绝对路径调用的。

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

答案 1 :(得分:0)

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

use Cwd qw(abs_path);
my $absolute_path = abs_path (readlink $link);

https://www.perlmonks.org/?node_id=977420