IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Récupérer le chemin vers une commande


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut Récupérer le chemin vers une commande
    Bonjour,
    j'aimerais récupérer le chemin d'accès vers une commande dans une chaîne.
    Exemple :
    La commande 'ls' est dans /usr/bin/ls
    j'aimerais que $string vaille "/usr/bin/"

    Je suppose que je dois faire appel aux fonctions de File::Basename mais je n'arrive pas à me dépatouiller.

    Merci à ceux qui pourront m'aider.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    lami20j@debian:~$ cat chemin_commande.pl
    #!/usr/bin/perl
    use strict;use warnings;
    use File::Basename;
     
    my $commande="/usr/bin/ls";
    my $string=dirname($commande) . '/';
     
    print "$string\n";
     
    __END__
    lami20j@debian:~$ perl chemin_commande.pl
    /usr/bin/
    lami20j@debian:~$
    --
    lami20j

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    Merci, mais si justement je ne sais pas que c'est dans /usr/bin/. Est-ce que je peux faire un truc du genre "which ls" ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    lami20j@debian:~$ cat chemin.pl
    #!/usr/bin/perl
    use strict;use warnings;
    use File::Basename;
     
    print "Tapez une commande : ";
    chomp (my $commande = <STDIN>);
    my $cmd=qx/whereis -b $commande/;
    $cmd=~/.*:\s+(.*?)(\s|$)/;
    my $string=dirname($1) . '/';
     
    print "$string\n";
     
    __END__
    Exemples

    lami20j@debian:~$ perl chemin.pl
    Tapez une commande : perl
    /usr/bin/
    lami20j@debian:~$ perl chemin.pl
    Tapez une commande : bash
    /bin/
    lami20j@debian:~$ perl chemin.pl
    Tapez une commande : reboot
    /sbin/
    lami20j@debian:~$ perl chemin.pl
    Tapez une commande : ls
    /bin/
    lami20j@debian:~$
    --
    lami20j

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Quitte à utiliser une commande externe, autant utiliser directement which qui au moins donne uniquement la réponse souhaité par le posteur et ne requiert pas de post-traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #! /usr/bin/perl
    use strict; use warnings;
    use v5.10;
    use File::Basename;
     
    $|++;
    print "Tapez une commande : ";
    chomp (my $commande = <STDIN>);
    chomp(my $cmd=qx/which $commande/);
     
    say dirname($1), '/';
     
    __END__
    --
    Jedaï

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut
    OK, c'est parfait.
    Merci à tous les deux.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    Citation Envoyé par Jedai Voir le message
    Quitte à utiliser une commande externe, autant utiliser directement which qui au moins donne uniquement la réponse souhaité par le posteur et ne requiert pas de post-traitement :
    Je ne savais pas que which est une commande interne de Perl.
    En fait elle ne l'est pas, donc tu utilises aussi une commande externe, n'est-ce pas?
    La commande which cherche les fichiers exécutables dans la variable PATH, et c'est ça que j'ai pensé la 1ère fois.
    En revanche il y a des exécutables qui se trouvent dans des répertoires qui ne font pas partie de PATH et requiert un post-traitement.

    C'est pour ça que j'ai changé d'avis ;-)

    P.S.
    Voir man which et man whereis
    Bienvenu dans le monde GNU/Linux ;-)
    --
    lami20j

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par lami20j Voir le message
    Je ne savais pas que which est une commande interne de Perl.
    En fait elle ne l'est pas, donc tu utilises aussi une commande externe, n'est-ce pas?
    Peut-être serait-il préférable que tu vérifies le sens de l'expression "quite à ... autant ...".

    Citation Envoyé par lami20j Voir le message
    La commande which cherche les fichiers exécutables dans la variable PATH, et c'est ça que j'ai pensé la 1ère fois.
    En revanche il y a des exécutables qui se trouvent dans des répertoires qui ne font pas partie de PATH et requiert un post-traitement.
    Je suis conscient de la différence entre which et whereis, mais il y a a priori deux cas :
    • On n'a que le nom de la commande car elle est sur le PATH, which est plus simple.
    • On a le chemin complet de la commande car elle n'est pas sur le PATH, whereis n'est pas nécessaire, on peut utiliser dirname() directement.


    Le troisième cas hypothétique que tu sembles prendre en compte serait la recherche d'un binaire quelconque dont le nom correspond à l'entrée dans la totalité des emplacements considérés "standards" par whereis (mais pas forcément la totalité du PATH actuel, contrairement à which)... Je considère dans ce cas qu'on a affaire à un problème de recherche de fichier, certainement différent de la question initialement posée.

    Bien que ta réponse soit appropriée, elle me semble inutilement compliquée, le posteur a demandé un équivalent de "which" en Perl, pourquoi ne pas simplement lui rappeler qu'il peut appeler "which" à partir de son programme ? (A la limite si tu avais proposé une solution pure Perl plus ou moins multi-plateforme ç'aurait eu un autre intérêt)

    Bienvenu dans le monde GNU/Linux ;-)
    Ne t'inquiète pas, j'y suis depuis un certain temps...

    --
    Jedaï

Discussions similaires

  1. Récupérer la sortie d'une commande
    Par oceeco dans le forum wxPython
    Réponses: 3
    Dernier message: 11/02/2007, 20h37
  2. [MFC] Récupérer le chemin d'une image
    Par Rafoo dans le forum MFC
    Réponses: 2
    Dernier message: 08/06/2006, 14h52
  3. Récupérer le résultat d'une commande shell
    Par espadon1 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 10h01
  4. Réponses: 2
    Dernier message: 02/01/2006, 10h39
  5. Comment récupérer le chemin d'une table liée
    Par ptitepunk dans le forum Access
    Réponses: 2
    Dernier message: 15/09/2005, 10h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo