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

Shell et commandes GNU Discussion :

Fonction bash dont un argument contient un caractère spécial


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Par défaut Fonction bash dont un argument contient un caractère spécial
    Bonjour,

    J'ai déjà ouvert une discussion [1] concernant une fonction bash appelée "execcmd" qui :
    • affiche le nom de la commande à lancer
    • lance la commande
    • affiche un message pour dire si la commande a réussi ou échoué


    La solution qui ne fonctionne pas est de stocker la commande à lancer dans une variable. Puis d'exécuter la commande à l'aide de cette variable.
    La solution qui fonctionne est de stocker la commande à lancer dans les paramètres de la fonction. Puis d'exécuter la commande à l'aide de "$@".

    Mais j'ai remarqué un problème lorsque l'on souhaite passer une commande qui contient des caractères spéciaux comme le ">", ">>" ou encore le "|".
    Dans ce cas, ces caractères ne sont pas considérés comme des arguments de la fonction.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execcmd echo '#!/bin/bash' > /tmp/toto.txt
    Résultat (à l'affichage) :
    rien du tout ! (car le flux est redirigé vers le fichier)

    Résultat (dans le fichier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cat /tmp/toto.txt 
    executing the 'echo #!/bin/bash' command... Done.
    Pour résoudre ce problème, on peut utiliser la double quote "...".
    Mais dans ce cas, le symbole perd toute sa fonctionnalité dans la commande et devient une chaine de caractères ordinaire...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execcmd echo '#!/bin/bash' ">" /tmp/toto.txt
    Résultat (à l'affichage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    executing the 'echo #!/bin/bash > /tmp/toto.txt' command... Done.
    Résultat (dans le fichier) :
    le fichier /tmp/toto.txt n'existe pas !

    Est-ce que vous voyez une solution pour que la commande passée en arguments à la fonction soit prise en compte correctement ?

    Merci.

    [1] http://www.developpez.net/forums/d12...s-script-bash/

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonsoir.

    N_BaH va encore me taper dessus (Sve@r au secours ) mais bon j'avance quand même ma solution qui fonctionne à défaut de trouver mieux : eval .

    Démonstration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [idriss@hp-dv6:~]$ cat test.sh
    #!/bin/bash
     
    executeCmd(){
        echo "executing the '$@' command... "
        eval "$@"
    }
     
    executeCmd $@
    [idriss@hp-dv6:~]$ ./test.sh echo "salut" ">" test.txt
    executing the 'echo salut > test.txt' command... 
    [idriss@hp-dv6:~]$ cat test.txt 
    salut
    [idriss@hp-dv6:~]$
    Si quelqu'un propose quelque chose de mieux et de plus sûr tant mieux mais au moins tu as déjà une solution fonctionnelle. Personnellement eval ne m'a jamais posé de soucis et ça reste très pratique dans beaucoup de cas, notamment pour ces histoires de méta-caractères.

    Par exemple lors de sed construits dynamiquement où je concatène des expressions régulières de substitions ou la wildcard apparaît, j'ai souvent recours à eval lors de l'exécution finale afin d'éviter que bash interprète * comme la liste des fichiers du répertoire courant. Jusqu'ici j'en suis totalement satisfait.

    Cordialement,
    Idriss

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    Il faut bien se souvenir de ce que fait cette commande :
    Citation Envoyé par help eval
    Exécute des arguments comme s'ils étaient une commande du shell.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Exécute des arguments comme s'ils étaient une commande du shell.
    Ben à moins que j'ai mal compris, c'est un peu ce que cherche à faire YuGiOhJCJ avec sa fonction execcmd ?

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    c'est pour ça que je n'ai pas dégainé mon fouet
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bon beh ça prouve que eval c'est pas toujours evil


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

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/06/2015, 15h03
  2. [XL-2007] Fonction dont les arguments sont une partie d'un code URL
    Par Vince006 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/04/2012, 00h29
  3. Verifier qu'un champ ne contient aucun caractère spécial
    Par aemilia26 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 23/02/2010, 11h19
  4. parametre de formulaire dont la valeur contient de caractères spéciaux
    Par jakouz dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/04/2006, 14h29
  5. fonction dont les argument sont dans un dico
    Par GConstant dans le forum Général Python
    Réponses: 1
    Dernier message: 12/08/2004, 18h24

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