2015-06-03 131 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

相關問題