OVH Cloud OVH Cloud

Equivalent de "which". Comment faire ?

8 réponses
Avatar
Leon Nabot
Hello,

Quelqu'un connaîtrait il une méthode simple pour localiser un binaire
dans le PATH, bref faire l'équivalent d'un "which" (Je suis sous Unix)
et ceci en utilisant les fonctions/librairies standards d'un Perl 5.005.

J'ai essayé en récupérant la sortie de la commande Unix mais le retour
diffère selon les Unix, en particulier sous Solaris si la commande
recherchée est aliasé, le retour est erroné.

A l'heure actuelle, à part écrire une routine balayant chaque répertoire
du PATH à la recherche de l'exécutable, je ne vois pas de solution.

Des idées ?

Cdlt

Léo

8 réponses

Avatar
damien guerin
Avatar
Stephane Zuckerman
Quelqu'un connaîtrait il une méthode simple pour localiser un binaire
dans le PATH, bref faire l'équivalent d'un "which" (Je suis sous Unix)
et ceci en utilisant les fonctions/librairies standards d'un Perl 5.005.

J'ai essayé en récupérant la sortie de la commande Unix mais le retour
diffère selon les Unix, en particulier sous Solaris si la commande
recherchée est aliasé, le retour est erroné.

A l'heure actuelle, à part écrire une routine balayant chaque répertoire
du PATH à la recherche de l'exécutable, je ne vois pas de solution.


Etant donné que c'est exactement ce que fais which sous UNIX, je ne vois
pas trop comment faire autrement. :-)

Donc il faut récupérer le PATH, faire un joli split(':',$path) dessus,
et investiguer pour chaque entrée

un truc du genre


use strict;
use warnings;

my $file_to_find = 'mon_fichier';
my @files = map {
$_ if (exists_file_in_dir($file_to_find)
} split ':', $ENV{'PATH'};

sub exists_file_in_dir {
# le code de recherche de fichier dans le répertoire qui va bien ici.
}

Enfin, quelque chose dans le genre :)
--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Eric Jacoboni
Leon Nabot writes:

Quelqu'un connaîtrait il une méthode simple pour localiser un binaire
dans le PATH, bref faire l'équivalent d'un "which" (Je suis sous Unix)
et ceci en utilisant les fonctions/librairies standards d'un Perl 5.005.

J'ai essayé en récupérant la sortie de la commande Unix mais le retour
diffère selon les Unix, en particulier sous Solaris si la commande
recherchée est aliasé, le retour est erroné.


Et 'type' ne marche pas non plus ?

--
Éric Jacoboni, né il y a 1427887023 secondes

Avatar
Eric Jacoboni
Stephane Zuckerman writes:

Etant donné que c'est exactement ce que fais which sous UNIX, je ne vois
pas trop comment faire autrement. :-)


Non, which ne marche pas pour les alias (ou, plutôt, il ne prend en
compte que ceux définis dans .cshrc, donc si ton shell est un Bourne
shell tu es marron). D'autre part, type est défini par POSIX alors que
which ne l'est pas.

La bonne commande est type :

$ which ll
no ll in /opt/local/ada/bin/ /opt/local/bin /opt/local/bin
/bin /sbin /usr/bin /usr/sbin /usr/local/bin
$ type ll
ll is an alias for 'ls -al'

Mais, accessoirement, du point de vue de la sécurité, je ne suis pas
sûr que ce soit une très bonne idée de faire confiance à PATH pour
rechercher un programme...

--
Éric Jacoboni, né il y a 1427887873 secondes

Avatar
Stephane Zuckerman
Non, which ne marche pas pour les alias (ou, plutôt, il ne prend en
compte que ceux définis dans .cshrc, donc si ton shell est un Bourne
shell tu es marron). D'autre part, type est défini par POSIX alors que
which ne l'est pas.


Bien bien, je m'écrase donc mollement. :-)

Mais, accessoirement, du point de vue de la sécurité, je ne suis pas
sûr que ce soit une très bonne idée de faire confiance à PATH pour
rechercher un programme...
Certes. D'un autre côté, tout dépend de la finalité de l'application, et

de son contexte d'utilisation.

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
David LE BOURGEOIS
Hello,


Salut.

Quelqu'un connaîtrait il une méthode simple pour localiser un binaire
dans le PATH, bref faire l'équivalent d'un "which" (Je suis sous Unix)
et ceci en utilisant les fonctions/librairies standards d'un Perl 5.005.

J'ai essayé en récupérant la sortie de la commande Unix mais le retour
diffère selon les Unix, en particulier sous Solaris si la commande
recherchée est aliasé, le retour est erroné.

A l'heure actuelle, à part écrire une routine balayant chaque répertoire
du PATH à la recherche de l'exécutable, je ne vois pas de solution.
Des idées ?


Quelque chose comme ça ?

$ perl -e 'map {print "$_/$ARGV[0]n" if -f "$_/$ARGV[0]"}
split /:/, $ENV{PATH}' ls
/bin/ls

Sinon, que donne type ?

Et avec zsh ?

$ bash
$ which which
/usr/bin/which
$ zsh
$ which which
which: shell built-in command

--
David LE BOURGEOIS

Avatar
Laurent Wacrenier
Leon Nabot écrit:
Quelqu'un connaîtrait il une méthode simple pour localiser un binaire
dans le PATH, bref faire l'équivalent d'un "which" (Je suis sous Unix)
et ceci en utilisant les fonctions/librairies standards d'un Perl 5.005.

J'ai essayé en récupérant la sortie de la commande Unix mais le retour
diffère selon les Unix, en particulier sous Solaris si la commande
recherchée est aliasé, le retour est erroné.


vérifier que "command -v" renvoie quelque chose commençant par un "/".
C'est le comportement POSIX.

A l'heure actuelle, à part écrire une routine balayant chaque répertoire
du PATH à la recherche de l'exécutable, je ne vois pas de solution.


Ben oui

sub type($) { grep { -x "$_" }
map { $_ eq "" ? $_[0] : "$_/$_[0]" }
split(":", $ENV{PATH})
}

Avatar
Leon Nabot
D'abord, merci à tous pour vos réponses.

Effectivement comme beaucoup l'on suggéré, utiliser "type" arrange bien
les choses, j'aurais du y penser (Je m'excuse, c'est la fin de la semaine,
j'avais pas encore avalé mes deux litres de café matinaux et
manifestement la plupart de mes neurones sont partis en week-end sans moi ;-) )

Sinon, j'ai aussi la ligne de commande suivante dérivée des solutions
proposés et qui arrive au même résultat:

foreach (split(/:/,$ENV{PATH})) { print "Found $_/<cmd>n" if -x "$_/<cmd>" }

Me reste plus qu'à trouver une pièce de monnaie pour tirer au sort
quelle solution j'utilise :-)

Merci encore de votre aide.

Cdlt

Léo