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 :

argument avec espace passé en ligne de commande


Sujet :

Langage Perl

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut argument avec espace passé en ligne de commande
    Salut,


    J'ai un script qui gère mal les arguments dans @ARGV, car il sépare en plusieurs arguments lorsqu'il y a un espace dans un argument, alors que ce dernier est pourtant mis entre ""

    quelqu'un saurait-il comment régler ce léger problème ?

    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    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
    La réponse dépend du script. C'est le shell qui se charge de mettre les bons arguments dans @ARGV, donc tu ne peux rien faire si le dysfonctionnement est du côté du shell (ou plutôt du côté de la personne qui a mal rédigé les arguments du script). Cependant tu sembles dire que le script lui-même redécoupe les arguments qui lui sont donnés ? Dans ce cas il suffit de modifier le script pour qu'il ne fasse plus cela. A moins qu'il y ait une réelle raison pour ce comportement ?

    --
    Jedaï

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 581
    Points : 2 029
    Points
    2 029
    Par défaut
    Sinon, comment récupères-tu les données rangées dans @ARGV ?

    Peut-on voir un bout de ton code ?

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    je récupère les arguments contenus dans @ARGV avec
    car le nombre d'arguments n'est pas connu à l'avance...

    pour ce qui est de l'appel du script via le shell, je lance :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./mon_script.pl "[ejfdjhgdf]courant d'air" courant_d-air
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  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
    Dans ce cas le problème n'est pas dans le parsing des arguments, mais plutôt dans leur utilisation... Un exemple courant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $var = shift;
    system "command $var";
    Si tu appelles ce script avec comme paramètre "hello world", $var contiendra hello world (sans les guillemets), d'où plantage quand tu utilises system avec une commande qui n'attend qu'un seul argument...

    La solution dans ce cas est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $var = shift;
    system 'command', $var;
    (D'une manière générale, il vaut toujours mieux utiliser la version à plusieurs arguments de system() ou exec(), sauf si on a explicitement besoin que la ligne de commande soit interprétée par un shell)

    Evidemment il y a d'autres endroits où cela peut poser problème, sans ton script, nous ne pouvons pas t'en dire plus.

    --
    Jedaï

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    non je n'utilise pas system ensuite... je fais juste un echo pour le moment

    en gros, c'est un script pour renommer des fichiers...

    donc je lis le premier nom de fichier, le nouveau nom, et j'utilise rename... avec tous les tests qui vont bien.
    or a cause de l'espace, ça passe pas
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  7. #7
    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 gorgonite
    or a cause de l'espace, ça passe pas
    Ce n'est pas à cause de l'espace que ça ne passe pas, rename s'en contrefout... Néanmoins il peut y avoir d'autres obstacle à rename, par exemple si tu changes de fs, ça ne marche pas. C'est pourquoi je recommanderai plutôt d'utiliser le move() de File::Copy, rename() est une fonction de bas niveau (directement un appel système en fait), File::Copy est livré en standard avec Perl depuis Perl 5.2, donc aucun problème de portabilité !

    Si ça ne marche toujours pas, tu pourrais peut-être nous montrer ton code finalement ? Je sais que c'est top secret, mais de ce que tu nous dis ça n'a pas l'air si critique que ça ...

    --
    Jedaï

  8. #8
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    ben je lance cette commande :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    www-data@GorgonMobile:/home/gorgonite$ ssh gorgonite@localhost \ /home/gorgonite/ensta/clubinfo/admin.pl \[eyfjghdjhg34TY\]fichier\ super\ d?air fichier-air
    fichier [eyfjghdjhg34TY]fichier
    Le fichier [eyfjghdjhg34TY]fichier n'existe pas


    voici mon script
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #! /usr/bin/perl
    # vim:set ts=4 sw=4 : 
     
    use strict;
    use warnings;
     
    sub usage() {
            exit;
    }
     
    sub problem($) {
            my $msg = shift @_;
            print "$msg\n";
            exit(-1);
    }
     
    $ARGV[0] or usage(); 
    my $tempDir = "/home/gorgonite/temp";
    my $ftpDir = "/home/gorgonite/temp/temp_ftp";
    chdir($tempDir);
     
     
    while (my $file = shift @ARGV) {
            if ($file =~ m/\.\./) {
                    problem("fichier $file incorrect");
            }
        print "fichier $file\n";
            if (my $newName = shift @ARGV) {
                    if ($file =~ m/\.\./) {
                            problem("fichier $newName incorrect");
                    }
                    if (-e $file) {
                            chmod(0664,$file);
                            my $newFile = "$ftpDir/$newName";
                            if (-e $newFile) {
                                    problem("Le fichier $newFile existe déjà");
                            } else {
                                    print "$file\t->\t$newFile\n";
                                    rename($file,$newFile);
                            }
                    } else {
                            problem("Le fichier $file n'existe pas");
                    }
            } else {
                    problem("Il manque le nouveau nom de fichier pour $file");
            }
    }
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  9. #9
    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
    Après test, j'ai confirmation de mon idée :
    Ton problème n'est pas Perl, mais ssh... Si tu utilises exactement la même ligne en local, ça marchera comme une fleur. Avec ssh tu as droit à une double interprétation des arguments, tu dois donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh gorgonite@localhost \ /home/gorgonite/ensta/clubinfo/admin.pl \\\[eyfjghdjhg34TY\\\]fichier\\\ super\\\ d\?air fichier-air
    Ou un truc comme ça !

    --
    Jedaï

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    Citation Envoyé par Jedai
    Après test, j'ai confirmation de mon idée :
    Ton problème n'est pas Perl, mais ssh... Si tu utilises exactement la même ligne en local, ça marchera comme une fleur. Avec ssh tu as droit à une double interprétation des arguments


    tu as raison... je me disais bien que je l'avais déjà testé ce truc là en plus

    ça marche
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Config de ssh pour se connecter avec le mot de passe en ligne de commande
    Par arrakis75 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 12/06/2013, 23h09
  2. Taille d'un argument passé en ligne de commande limité !
    Par benthebest dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 06/05/2010, 13h30
  3. Argument passé en ligne de commande
    Par katoyi dans le forum VB.NET
    Réponses: 1
    Dernier message: 09/10/2008, 10h45
  4. Récupérer des arguments passé en ligne de commande
    Par FinalSpirit dans le forum VBScript
    Réponses: 2
    Dernier message: 01/10/2007, 10h54
  5. Réponses: 3
    Dernier message: 03/03/2007, 19h50

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