我有这样的事情:检查文件是否存在,甚至在PATH
if(! -e $filename) {
# do something
}
,但我需要改变它,这样它看起来甚至文件在我的道路。有没有办法在不分析PATH的情况下实现这一点?
我有这样的事情:检查文件是否存在,甚至在PATH
if(! -e $filename) {
# do something
}
,但我需要改变它,这样它看起来甚至文件在我的道路。有没有办法在不分析PATH的情况下实现这一点?
当加载可执行文件时,系统使用PATH
变量。因此,要让底层系统为您完成工作,我相信您需要尝试加载可执行文件。这听起来不像是你想要做的。
很可能有一些库会提供这样的功能,但编写自己的库很简单。你只需要使用split
然后迭代。
你怎么能看到,如果一个文件在$ENV{PATH}
指定的目录中不看$ENV{PATH}
? …这是一个修辞问题。
这是前段时间的short script I wrote。您应该能够适应它为您的需求:
#!/usr/bin/perl
use strict; use warnings;
use File::Basename;
use File::Spec::Functions qw(catfile path);
my $myname = fileparse $0;
die "Usage: $myname program_name\n" unless @ARGV;
my @path = path;
my @pathext = (q{});
if ($^O eq 'MSWin32') {
push @pathext, map { lc } split /;/, $ENV{PATHEXT};
}
PROGRAM: for my $progname (@ARGV) {
unless ($progname eq fileparse $progname) {
warn "Not processed: $progname\n\tArgument is not a plain file name\n";
next PROGRAM;
}
my @results;
for my $dir (@path) {
for my $ext (@pathext) {
my $f = catfile $dir, "$progname$ext";
push @results, $f if -x $f;
}
}
print "$progname:\n";
print "\t$_\n" for @results;
}
为了补充daxim's和Sinan Ünür's有用的答案:
在有限的情况下,如果你只关心一个给定的程序是否是该系统的路径,你可以采取快捷:
如果目标程序是一个CLI是有一个免费的副作用选项(不是生产标准输出输出等)导致程序很快顺利退出 - 例如,--version
- 你可以做到以下几点:
my $exe = 'bash'; # example
`$exe --version` || die "'$exe' not found.";
是否适用于文件工作,这是不可执行? –
␠␠␠␠␠␠␠␠␠␠␠␠ – daxim
这应该没问题,因为当涉及到'PATH'时,您会对其他文件感兴趣。但都是一样的,值得指出。 –