我的许多同事在其开始块中使用以下命令。
$scriptDir = dirname($0);
chdir($scriptDir);
$scriptDir = getcwd();
我环顾四周,不禁认为第三行,即$scriptDir = getcwd();
是多余的。因为我们已经有$scriptDir = dirname($0);
.am的ScriptDir,所以我在这里缺少一些东西?
dirname($0)
不返回完整的路径,因为Chankey Pathak和Matthias演示。
我想补充一点,还有其他方法。例如,您可以使用Findbin(也可以使用Core)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
$RealBin
给出的内容与您显示的内容相同,除了它是解决链接的完整路径。
感谢Ikegami的评论,Chdir可能会失败。在这种情况下,返回false,上面的代码死亡,请作为合适的调整。请注意,提问的第三行与此无关。
此模块也通常用于使用Lib Pragma库的相对路径,例如
use lib "$RealBin/../lib";
可能使两者使用它的决定更容易。
甚至更多,给定File :: Basename(原始重点)的dirname
描述
提供了与Unix shell命令
dirname(1)
的兼容性,并继承了其一些怪癖。尽管它的名称始终会按照您的期望返回目录名称。为了安全起见,如果您想要路径的目录名称,请使用fileparse()
。
我宁愿去
use Cwd qw(abs_path);
BEGIN: {
my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|;
chdir $scriptDir
or die "Can't change to $scriptDir: $!";
};
使用abs_path
,因为__FILE__
本身可能无法提供完整的路径。正则贪婪地将所有内容剥落到最后的/
,即通往脚本目录的完整路径。
- getCWD-返回当前的工作目录
- chdir-将工作目录更改为expr
以下示例很好地解释了。
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use Cwd;
my $scriptDir = dirname($0);
chdir($scriptDir);
print "First: $scriptDirn";
$scriptDir = getcwd();
print "Second: $scriptDirn";
输出:
chankeypathak@stackoverflow:~/Desktop$ perl test.pl
First: .
Second: /home/chankeypathak/Desktop
我不是下一个Perl Monger,但我试图用一些脚本执行您给出的代码:
#!/usr/bin/perl
#
use strict;
use File::Basename;
use Cwd;
BEGIN {
my $scriptDir = dirname($0);
print "scriptDir = $scriptDirrn";
chdir($scriptDir);
$scriptDir = getcwd();
print "scriptDir = $scriptDirrn";
}
这就是出来的:
map@host:~/perltest> ./script.pl
scriptDir = .
scriptDir = /home/map/perltest
map@host:~/perltest>
看起来DirName和GetCWD在这种情况下有所作为。但是,如果在路径中找到脚本。
map@host:~> cp script.pl ~/bin
map@host:~> cd
map@host:~> script.pl
scriptDir = /home/map/bin
scriptDir = /home/map/bin
map@host:~> rm ~/bin