2011-11-23 4 views

Répondre

8
+1

Est-ce que le travail pour les fichiers qui ne sont pas exécutables ? –

+0

N ° – daxim

+0

Cela devrait être très bien, car ce que d'autres fichiers vous seraient intéressés en se référant à 'PATH'. Mais tout de même, ça vaut le coup de le souligner. –

3

La variable PATH est utilisée par le système lors du chargement des exécutables. Donc, pour que le système sous-jacent fasse le travail pour vous, je crois que vous devriez essayer de charger un exécutable. Cela ne semble pas être ce que vous cherchez à faire.

Il se peut qu'il existe une bibliothèque qui offre une telle fonctionnalité, mais il est très simple d'écrire la vôtre. Vous avez juste besoin d'utiliser split, puis itérer.

4

Comment pouvez-vous voir si un fichier est dans l'un des répertoires spécifiés dans $ENV{PATH} sans regarder $ENV{PATH}? & hellip; C'est une question rhétorique.

Voici un short script I wrote il y a un certain temps. Vous devriez être en mesure de l'adapter à vos besoins:

#!/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

Pour diviser la manière multiplateforme PATH, [File :: Spec-> path] (http://search.cpan.org/perldoc?File::Spec#path) peut être utilisé pour les obtenir sous forme de liste. Pas besoin de jouer avec '$^O'. – bvr

+1

** J'utilise déjà 'File :: Spec-> path'. ** Notez que'% PATHEXT% 'est une chose totalement différente qui n'est utile que sous Windows. Et, je ne joue pas avec '$^O'; Je l'inspecte. –

+1

Oups, vous avez raison. Je regarderai mieux la prochaine fois ... utiliser PATHEXT est une bonne idée pour trouver des exécutables sur Windows. – bvr

0

Pour compléter daxim's et Sinan Ünür's réponses utiles:

Dans limitées circonstances, si vous vous souciez que si oui ou non un programme donné est en le chemin du système, vous pouvez prendre un raccourci :

Si le programme cible est une CLI a une option sans effet secondaire (autres que la production de sortie stdout) qui provoque le programme pour sortir avec succès très rapidement - par exemple, --version - vous pouvez effectuer les opérations suivantes:

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