2009-06-23 204 views

回答

6

使用FindBin模塊:

$ cat /tmp/foo/bar/baz/quux/prog 
#! /usr/bin/perl 

use FindBin; 

print "$FindBin::Bin/$FindBin::Script\n"; 

$ PATH=/tmp/foo/bar/baz/quux prog 
/tmp/foo/bar/baz/quux/prog 

$ cd /tmp/foo/bar/baz/quux 

$ ./prog 
/tmp/foo/bar/baz/quux/prog 
+0

是的,這是我需要的。謝謝 – 2009-06-23 16:19:18

1

看起來你只需要將路徑展開爲它們的絕對值。檢查this article如何做到這一點。

+0

您不能將./my.pl擴展到任何東西,除非您知道撥打電話時的位置(即CWD) – 2009-06-23 16:17:56

+0

這也不處理波浪擴展。 – 2009-06-23 16:20:38

0

使用FindBin模塊

5

這聽起來像你正在尋找的rel2abs function in File::Spec。例如:

#!/usr/bin/perl 

use File::Spec; 
my $location = File::Spec->rel2abs($0); 
print "$location\n"; 

這將在你所描述的方式解決$ 0:

$ ./myfile.pl 
/Users/myname/myfile.pl 
$ ~/myfile.pl 
/Users/myname/myfile.pl 

或者,你可以在使用方式不盡相同Cwd::abs_path

0

在文件本身是符號鏈接的情況下,上述許多概念都會中斷。我通常以以下方式啓動我的腳本:

use strict; 
use English; 
use warnings; 

use Cwd qw(realpath); 
use File::Basename; 
use lib &File::Basename::dirname(&Cwd::realpath($PROGRAM_NAME)); 

希望這會有所幫助。

相關問題