更改为目录然后getcwd()

时间:2016-12-23 06:37:15

标签: perl dirname getcwd

我的许多同事在他们的BEGIN块中使用以下命令。

$scriptDir = dirname($0);
chdir($scriptDir);
$scriptDir =  getcwd();

我环顾四周,无法帮助,但认为第三行即$scriptDir = getcwd();是多余的。因为我们已经有来自$scriptDir = dirname($0);的scriptdir。我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:7)

dirname($0)并未返回完整路径,Chankey PathakMatthias 演示。

我想补充说还有其他方法。例如,您可以使用FindBin(也是核心)

use FindBin qw($RealBin);

BEGIN: {
    my ($scriptDir) = $RealBin;
    chdir $scriptDir             or die "Can't change to $scriptDir: $!";
};

$RealBin与您展示的内容相同,只是它是已解决链接的完整路径。

由于chdir的评论,ikegami可能会失败。在这种情况下,返回false并且上面的代码消失,根据需要进行调整。请注意,质疑的第三行与此无关。

此模块也常用于具有lib编译指示的库的相对路径,例如

use lib "$RealBin/../lib";

可能会更容易决定将它用于两者。

更多的是,考虑File::Basenamedirname描述(强调不是我的

  

提供此函数是为了与Unix shell命令dirname(1)兼容,并继承了它的一些怪癖。尽管它的名称是 NOT 总是返回您可能期望的目录名称。为安全起见,如果您希望路径的目录名称使用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__本身可能无法提供完整路径。正则表达式贪婪地将所有内容挖到最后/,即脚本目录的完整路径。

答案 1 :(得分:4)

  • getcwd - 返回当前工作目录
  • chdir - 将工作目录更改为EXPR

下面的例子很好地解释了它。

#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use Cwd;

my $scriptDir = dirname($0);
chdir($scriptDir);
print "First: $scriptDir\n";
$scriptDir =  getcwd();
print "Second: $scriptDir\n";

输出:

chankeypathak@stackoverflow:~/Desktop$ perl test.pl 
First: .
Second: /home/chankeypathak/Desktop

答案 2 :(得分:0)

我不是下一个perl monger,但我尝试用一​​个小脚本执行你给出的代码:

#!/usr/bin/perl
# 

use strict;
use File::Basename;
use Cwd;

BEGIN {
  my $scriptDir = dirname($0);
  print "scriptDir = $scriptDir\r\n";
  chdir($scriptDir);
  $scriptDir =  getcwd();
  print "scriptDir = $scriptDir\r\n";
}

这就是出来的结果:

map@host:~/perltest> ./script.pl 
scriptDir = .
scriptDir = /home/map/perltest
map@host:~/perltest> 

看起来dirname和getcwd在这种情况下有所不同。但是,如果在路径中找到了scrip.pl,则没有区别:

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