我有这样的事情:
if(! -e $filename) {
# do something
}
但我需要改变它,以便它甚至在我的PATH上查找文件。有没有办法在不分析PATH的情况下实现这一目标?
答案 0 :(得分:8)
答案 1 :(得分:4)
如何在不查看$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;
}
答案 2 :(得分:3)
加载可执行文件时系统使用PATH
变量。因此,为了让底层系统为您完成工作,我相信您需要尝试加载可执行文件。这听起来并不像你想要做的那样。
可能会有一些库提供这样的功能,但编写自己的库非常简单。您只需使用split
然后迭代。
答案 3 :(得分:0)
补充daxim's和Sinan Ünür's有用的答案:
在有限的情况下,如果您只关心是否某个给定的程序在系统的路径中,您可以使用快捷方式:
如果目标程序是一个具有无副作用选项的CLI(生成stdout输出除外),导致程序成功退出 - 例如--version
- 您可以执行以下操作:
my $exe = 'bash'; # example
`$exe --version` || die "'$exe' not found.";
答案 4 :(得分:0)
如果要使用核心模块,则can_run()
中有IPC::Cmd。
use IPC::Cmd qw(can_run);
if (can_run($filename)) {
# do something
}
File::Which的perldoc指出一个警告,即使它不在您的路径中,它也会搜索当前目录:
IPC :: Cmd
带有“ can_run”函数,其语义与 传统的UNIX在哪里。它将在当前位置找到可执行文件 目录,即使当前目录没有被搜索 在Unix上默认。