如何打印脚本的目录路径而不解析符号链接?
编辑:我从下面的评论中意识到,使用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