2011-11-23 46 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.";