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 stderr d'un open dans une variable


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut récupérer le stderr d'un open dans une variable
    Bonjour,

    voici mon pb qui je pense sera bien simple à résoudre pour un codeur avisé que je ne suis pas encore.

    voici deux lignes de codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    open (TEST, "touch /test |")
    close (TEST);
    comme je lance ce petit script avec un user normal, forcement je me prends l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touch: cannot touch `/test': Permission denied
    et voilà mon problème : j'aimerai pouvoir stocker cette sortie d'erreur dans un tableau!

    je sais comment rediriger une erreur dans un shell, mais dans perl je n'ai pas trouver comment faire....

    merci d'avance

  2. #2
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $sortie = `touch /test`;
    print $sortie;
    Executer une commande shell avec les ` (ceux sous le 7) te permet de récupérer la sortie de la commande. On peut aussi avec qx{}.
    Tu pourras ensuite faire de la sortie ce bon il te semble comme le mettre dans un tableau etc.

    Le même problème était expliqué dans ce post
    http://www.developpez.net/forums/d83...ge/test-shell/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Merci de ta réponse.

    par contre j'ai un doute sur l'envoi dans la variable, car si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $sortie = `touch /test`;
    print $sortie;
    print $sortie;
    print $sortie;
    ca ne m'affiche qu'une fois l'erreur, alors que ca devrait me l'afficher au min 3 fois non?

    j'ai trouver différentes explications notemment ici : http://perl.unices.org/node38.html

    mais j'ai l'impression que je tombe tjrs sur le meme pb?
    je fais kkchoz de mal mais je sais pas quoi.

  4. #4
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Effectivement, je n'avais pas fait attention que c'était la sortie d'erreur que tu voulais.

    En redirigeant ton erreur sur ta sortie standard avec le 2 > &1 tu résouds ton problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @tab;
    my $sortie = `touch /test 2>&1`;
    push(@tab,$sortie);
    print $tab[0];
    print $tab[0];
    print $tab[0];

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Quand on souhaite travailler avec le stderr et stdout d'un processus, penser à utiliser le IPC::open3.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Merci Philou67430 pour l'alternative qui est d'utiliser open3. C'est beaucoup mieux avec ce module en effet.
    J'oublie trop souvent de regarder les modules existants au profit des solutions "maison".
    C'est mon premier jour en tant qu'inscrit sur le forum et il faut que j'y prenne de la graine.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Installe toi le moteur de recherche "cpan" dans ton navigateur... il suffit d'aller sur search.cpan.org, et il apparait dans la liste des moteurs à ajouter à la barre d'outil de recherche (pour Firefox, entre autre).
    Tu auras alors un joli dromadaire à coté de g de google
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    c'est parfait, merci beaucoup!

    je vais aussi jeter un oeil au module.

    bonne journée

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    je me permet de reposter ici.

    bon je récupère bien la sortie standard ainsi que la sortie d'erreur grâce à "2>&1"

    donc si la commande réussi ou si elle renvoi un message d'erreur, je récupère tout ca.

    par contre il y a quelque chose d'autre que j'aimerai récupérer :

    il s'agit de l'erreur renvoyer par le shell si la commande n'existe pas. (je récupère bien un message du type "permission refusée", mais pas "la commande n'existe pas)

    en effet, si la commande utilisé n'existe pas sur l'OS, je devrais avoir une erreur du style : "zsh: command not found: svgg", mais je ne la récupère pas celle là.

    existe t'il un technique pour pouvoir récupérer ce type d'erreur également?

    thx by advance

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    existe t'il un technique pour pouvoir récupérer ce type d'erreur également?
    Oui, voir les variables spéciales $? et $!

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    j'utilise déja la variable $? qui me retourne un numéro (1, 256,...), qui est un numéro retourné en fonction de l'erreur (si erreur il y a).

    Par contre, lorsque j'execute une commande que le systeme ne connait pas, la variable $! me retourne "No such file or directory" alors qu'elle devrait me retourner plutot "zsh: command not found: ma_commande".

    n'y aurait t'il pas qqchose à chercher du coté du 2>&1? (quelque chose de plus complet par exemple)

    merci de ta réponse

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Par contre, lorsque j'execute une commande que le systeme ne connait pas, la variable $! me retourne "No such file or directory" alors qu'elle devrait me retourner plutot "zsh: command not found: ma_commande".
    Tu supposes que Perl lance le shell, qui lui-même lance la commande, mais la plupart du temps ce n'est pas le cas. Il lance directement la commande en gérant lui-même la redirection 2>&1 et sans passer un shell, pour des raisons de performance.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    donc en gros le "No such file or directory", c'est un peu comme si c'était son interprétation de l'erreur système.

    comment pourrais je passer "un peu plus" par le shell et avoir la vrai erreur...

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par vercetty92 Voir le message
    j'utilise déja la variable $? qui me retourne un numéro (1, 256,...), qui est un numéro retourné en fonction de l'erreur (si erreur il y a).
    Apparemment $? vaut -1 suite à l'échec de lancement d'une commande externe inexistante
    Je pense qu'il suffit de tester spécifiquement cette valeur.

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par vercetty92 Voir le message
    donc en gros le "No such file or directory", c'est un peu comme si c'était son interprétation de l'erreur système.

    comment pourrais je passer "un peu plus" par le shell et avoir la vrai erreur...
    Il suffit d'exécuter le shell j'imagine:
    system("zsh -c ligne de commande ....");

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    ok, j'ai fait un "if" le résultat = -1 donc j'affiche "command not found" et ca marche.

    merki beaucoup

Discussions similaires

  1. Récupérer un bout de fichier texte dans une variable
    Par killerman31 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 15/01/2009, 12h03
  2. Récupérer le résultat d'un .exe dans une variable
    Par stepd dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 02/12/2008, 09h38
  3. Réponses: 8
    Dernier message: 18/04/2008, 17h40
  4. Récupérer le contenu de la requête dans une variable
    Par cgonzalez dans le forum Langage
    Réponses: 1
    Dernier message: 06/10/2007, 11h44
  5. récupérer le résultat d'un SELECT dans une variable ?
    Par budhax dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/06/2006, 10h24

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