检查文件是否存在于PATH上

时间:2011-11-23 13:42:47

标签: perl

我有这样的事情:

if(! -e $filename) {
    # do something
}

但我需要改变它,以便它甚至在我的PATH上查找文件。有没有办法在不分析PATH的情况下实现这一目标?

5 个答案:

答案 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'sSinan Ü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上默认。