2011-11-23 49 views

回答

8
+1

是否适用于文件工作,这是不可执行? –

+0

␠␠␠␠␠␠␠␠␠␠␠␠ – daxim

+0

这应该没问题,因为当涉及到'PATH'时,您会对其他文件感兴趣。但都是一样的,值得指出。 –

3

当加载可执行文件时,系统使用PATH变量。因此,要让底层系统为您完成工作,我相信您需要尝试加载可执行文件。这听起来不像是你想要做的。

很可能有一些库会提供这样的功能,但编写自己的库很简单。你只需要使用split然后迭代。

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; 
} 
+0

对于拆分PATH多平台方式,可以使用[File :: Spec-> path](http://search.cpan.org/perldoc?File::Spec#path)将它们作为列表。不需要用'$^O'来玩。 – bvr

+1

**我已经使用'File :: Spec-> path'。**请注意,'%PATHEXT%'是一个完全不同的东西,它只对Windows有用。而且,我不是在玩'$^O';我正在检查它。 –

+1

糟糕,你是对的。下次看起来会更好......使用PATHEXT是在Windows上查找可执行文件的好主意。 – bvr

0

为了补充daxim'sSinan Ünür's有用的答案:

有限的情况下,如果你只关心一个给定的程序是否是该系统的路径,你可以采取快捷

如果目标程序是一个CLI是有一个免费的副作用选项(不是生产标准输出输出等)导致程序很快顺利退出 - 例如,--version - 你可以做到以下几点:

my $exe = 'bash'; # example 
`$exe --version` || die "'$exe' not found.";