如何在没有解析符号链接的情况下打印脚本的目录路径?
编辑:我从下面的评论中意识到使用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的配置方式。
答案 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);