2015-06-03 67 views
-1

如何解决符号链接打印脚本的目录路径而不是在不解析符号链接的情况下打印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目录一/二/ 3/symlink_to_four

/tmp/one/two/3$ ls -l 
four 
symlink_to_four -> four 

为什么我需要这个/:桑巴配置在我的Perl脚本要运行的Linux机器中,如果我用\\linux-machine-name 替换Linux路径的第一部分,并将其余部分替换为/\,我得到的Windows路径,我将它保存在一个文件中,并将被其他脚本使用,例如,在上面的示例中,我试图将/tmp/one/two/3/symlink_to_four转换为\\linux-machine-name\one\two\3\symlink_to_four,我知道如何计算出linux-machine-name,我不想要解决的路径,因为我无法弄清楚解决路径的Windows等价路径,只有\\linux-machine-name\one\two\3\symlink_to_four有效,而不是\\linux-machine-name\one\two\3\four,这是samba配置的方式。

+0

'FindBin'总是解析符号链接。你为什么要使用链接名称? – ThisSuitIsBlackNot

+0

另外''FindBin :: Bin'总是一个绝对路径,因此将它传递给'rel2abs'或'abs_path'是多余的。 – ThisSuitIsBlackNot

+0

这是很复杂的解释:(,我的脚本必须传递路径而不解析符号链接到其他脚本 – rodee

回答

1

如果我正确理解你想要达到什么样的,你可以用Path::Tiny做到这一点:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Path::Tiny; 


my $path = path(__FILE__); 

print $path->absolute->parent, "\n"; 

路径::微小的realpath方法可以解决的符号链接,但absolute方法没有。

__FILE__是一个特殊的标记,它解析为它包含的Perl源文件的名称(无论是主脚本还是它加载的模块)。您也可以使用$0这是正在执行的脚本的名称。根据脚本是使用相对路径还是绝对路径调用,其中的任何一个都可以是绝对路径或相对路径。

如果你的脚本总是被调用一个绝对路径,那么你可以只使用$0,而不是打扰一个额外的模块。

+0

谢谢,如果我可以在不安装Path :: Tiny或任何其他新的perl模块的情况下实现这一点,那将很容易。 – rodee

+0

我可以用$ 0来完成,谢谢。 – rodee

相关问题