更改为目录,然后更改为getCWD()



我的许多同事在其开始块中使用以下命令。

$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

相关内容

  • 没有找到相关文章

最新更新