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

Linux Discussion :

Shell et interprétation de commande


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut Shell et interprétation de commande
    Bonjour,

    Je suis en train de coder un script qui prend en paramètres des commandes à exécuter (espacées par des /n), du style maFonction echo banane /n echo tutu, et ça stocke stdout et stderr dans une variable.

    Voilà le code :

    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
     
    #!/bin/sh
     
    maFonction()
    { 
         CMD=""
         REPONSE=""
     
         while [ "$1" != "" ]
         do
    	if [ "$1" = "/n" ] 
    	then
    	    REPONSE="$REPONSE $($CMD 2>&1)"
    	    CMD=""
    	    shift 1
    	else
    	    CMD="$CMD $1"
    	    shift 1
    	fi
        done
     
    REPONSE="$REPONSE $($CMD 2>&1) ^Z"
    }
     
    maFonction "echo" "banane"
    Ceci marche très bien pour des exemples comme celui cité plus haut. Cependant, pour les commandes utilisant les pipes ou les redirection, ça ne veut pas interpréter !

    Ex : maFonction "echo" "banane" ">" "foo"
    maFonction "echo" "3:A" "|" "cut -d: -f1"

    En faisant ça, $REPONSE contient : "banane > foo" et "3:A | cut -d: -f1" ... pourquoi les > et | ne sont pas interprétés ???

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    bonjour syl

    parce que les métacaractères ne conservent pas leur propriétés quand ils placés entre guillemets.

    de la même manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo *
    fic1 fic2
    $ echo "*"
    *

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    bonjour syl

    parce que les métacaractères ne conservent pas leur propriétés quand ils placés entre guillemets.

    de la même manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo *
    fic1 fic2
    $ echo "*"
    *
    Hummmf ... 1er cours de 1ère année en effet ! b Mais c'est vrai qu'ils commencent à dater en même temps !
    En fait, ma question n'aurait pas du être "pourquoi", mais plutôt "comment" Y a-t-il un moyen plus simple et plus propre que de faire d'autres if et faire du coup des $($CMD1 | $CMD2) ? (ce qui en plus serait gênant en cas de plusieurs pipes dans la même instruction)

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Je ne suis pas sûr d'avoir vraiment compris ce que tu veux faire, mais tu peux peut-être t'inspirer de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maFonction () {
        STDOUT=`eval "$@"`
    }

  5. #5
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    À priori, la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonction banane > foo
    est d'abord interprétée par le shell en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ( maFonction banane ) > foo
    Donc le shell ne passe que l'argument 'banane' à maFonction.
    Une solution consiste à échapper les caractères spéciaux sur la ligne de commande (comme on fait pour passer une commande à l'option -exec de find par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    maFonction banane \> foo
    maFonction 'banane > foo'

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Concrètement, c'est un script qui lit un sms dans lequel des commandes shell ont été envoyées, et le script doit les interpréter (c'est pour un projet embarqué).

    Donc ce que je veux faire, c'est lire mot à mot le sms jusqu'à la fin OU lorsque je rencontre les caracteres /n qui indiquent le début d'une nouvelle commande. Mais comme je les lis un à un, je suis obligé de concaténer une chaine de caractère qui n'iterprete donc pas les | et autres <>.

    Pour te répondre nowan, en fait ce n'est pas vraiment comme ça que sont donnés les paramètres, mais plutôt : maFonction "echo banane > foo" en une seule fois ...

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Oui donc mon eval "$@" devrait faire l'affaire pour exécuter la chaine.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par matafan Voir le message
    Oui donc mon eval "$@" devrait faire l'affaire pour exécuter la chaine.
    Oui, c'est parfait

    Merci beaucoup matafan !

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

Discussions similaires

  1. Commande shell pour interpréter PHP
    Par TekFanatiX dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2009, 21h54
  2. Commande shell pour interpréter PHP
    Par TekFanatiX dans le forum Windows XP
    Réponses: 1
    Dernier message: 09/12/2008, 17h20
  3. [shell & VB] lancer une commande depuis VB
    Par vonemya dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/07/2008, 23h39

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