切换到一个目录,然后 getcwd()
Changing to a directory and then getcwd()
我的许多同事在他们的 BEGIN 块中使用以下命令。
$scriptDir = dirname([=10=]);
chdir($scriptDir);
$scriptDir = getcwd();
我环顾四周,不禁认为第三行,即 $scriptDir = getcwd();
是多余的。因为我们已经有了来自 $scriptDir = dirname([=12=]);
的 scriptdir。我在这里遗漏了什么吗?
下面的例子很好地解释了它。
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use Cwd;
my $scriptDir = dirname([=10=]);
chdir($scriptDir);
print "First: $scriptDir\n";
$scriptDir = getcwd();
print "Second: $scriptDir\n";
输出:
chankeypathak@Whosebug:~/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([=10=]);
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
dirname([=13=])
不是 return 完整路径,因为 Chankey Pathak and Matthias
演示。
我想补充一点,还有其他方法。例如,您可以使用 FindBin (也是核心)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
$RealBin
给出的与您显示的相同,只是它是已解析链接的完整路径。
chdir may fail, thanks to ikegami 为评论。在这种情况下,returned 为 false,上面的代码终止,请进行适当的调整。注意,质疑的第三行与此无关
此模块也常用于带有 lib pragma 的库的相对路径,例如
use lib "$RealBin/../lib";
是什么让我们更容易决定将它用于两者。
甚至更多,鉴于 File::Basename 中的 dirname
描述(原始重点)
This function is provided for compatibility with the Unix shell command dirname(1)
and has inherited some of its quirks. In spite of its name it does NOT always return the directory name as you might expect. To be safe, if you want the directory name of a path use 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__
本身可能无法提供完整路径。正则表达式贪婪地挖掘所有内容,直到最后一个 /
,即脚本目录的完整路径。
我的许多同事在他们的 BEGIN 块中使用以下命令。
$scriptDir = dirname([=10=]);
chdir($scriptDir);
$scriptDir = getcwd();
我环顾四周,不禁认为第三行,即 $scriptDir = getcwd();
是多余的。因为我们已经有了来自 $scriptDir = dirname([=12=]);
的 scriptdir。我在这里遗漏了什么吗?
下面的例子很好地解释了它。
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename;
use Cwd;
my $scriptDir = dirname([=10=]);
chdir($scriptDir);
print "First: $scriptDir\n";
$scriptDir = getcwd();
print "Second: $scriptDir\n";
输出:
chankeypathak@Whosebug:~/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([=10=]);
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
dirname([=13=])
不是 return 完整路径,因为 Chankey Pathak and Matthias
演示。
我想补充一点,还有其他方法。例如,您可以使用 FindBin (也是核心)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
$RealBin
给出的与您显示的相同,只是它是已解析链接的完整路径。
chdir may fail, thanks to ikegami 为评论。在这种情况下,returned 为 false,上面的代码终止,请进行适当的调整。注意,质疑的第三行与此无关
此模块也常用于带有 lib pragma 的库的相对路径,例如
use lib "$RealBin/../lib";
是什么让我们更容易决定将它用于两者。
甚至更多,鉴于 File::Basename 中的 dirname
描述(原始重点)
This function is provided for compatibility with the Unix shell command
dirname(1)
and has inherited some of its quirks. In spite of its name it does NOT always return the directory name as you might expect. To be safe, if you want the directory name of a path usefileparse()
.
我宁愿与
持平use Cwd qw(abs_path);
BEGIN: {
my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|;
chdir $scriptDir
or die "Can't change to $scriptDir: $!";
};
其中使用了 abs_path
,因为 __FILE__
本身可能无法提供完整路径。正则表达式贪婪地挖掘所有内容,直到最后一个 /
,即脚本目录的完整路径。