Проверьте, существует ли файл даже в PATH - PullRequest
4 голосов
/ 23 ноября 2011

У меня есть что-то вроде этого:

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

, но мне нужно изменить его так, чтобы он искал файл даже на моем путиЕсть ли способ достичь этого без анализа PATH?

Ответы [ 5 ]

8 голосов
/ 23 ноября 2011
4 голосов
/ 23 ноября 2011

Как вы можете увидеть, находится ли файл в одном из каталогов, указанных в $ENV{PATH}, не глядя на $ENV{PATH}?... Это риторический вопрос.

Вот короткий сценарий, который я написал некоторое время назад.Вы должны быть в состоянии адаптировать его для ваших нужд:

#!/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;
}
3 голосов
/ 23 ноября 2011

Переменная PATH используется системой при загрузке исполняемых файлов.Поэтому, чтобы заставить основную систему выполнить эту работу за вас, я думаю, вам нужно будет попытаться загрузить исполняемый файл.Не похоже, что это то, что вы хотите сделать.

Возможно, есть какая-то библиотека, которая предложит такую ​​функциональность, но написать свою собственную очень просто.Вам просто нужно использовать split, а затем повторить.

0 голосов
/ 04 декабря 2018

Если вы хотите использовать основной модуль, есть can_run() из IPC :: Cmd .

use IPC::Cmd qw(can_run);
if (can_run($filename)) {
    # do something
}

Perldoc для файла:: Который указывает на предостережение, что он также будет искать текущий каталог, даже если его нет в вашем пути:

IPC :: Cmd

Идет с "can_run "функция с немного другой семантикой, чем традиционная UNIX, где.Он найдет исполняемые файлы в текущем каталоге, хотя текущий каталог по умолчанию не ищется в Unix.

0 голосов
/ 10 июля 2015

В дополнение к Даксиму и Синан Юнюр полезных ответов:

В ограниченных обстоятельствах, если вы заботитесь только о независимо от того, или нет указанная программа находится в системном пути, вы можете воспользоваться ярлыком :

Если целевой программой является CLI, имеющий побочный эффект-свободная опция (кроме вывода вывода stdout), которая заставляет программу успешно завершиться очень быстро - например, --version - вы можете сделать следующее:

my $exe = 'bash';   # example
`$exe --version` || die "'$exe' not found.";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...