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 :

[bash] Commande avec guillemets dans une variable d'environnement


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Par défaut [bash] Commande avec guillemets dans une variable d'environnement
    Bonjour,

    Je suis confronté à un problème récurrent dont je n'arrive pas à trouver la solution.

    L'idée est, dans un environnement bash (sur Ubuntu 18 #46~18.04.1), d'envoyer des commandes via des variables d'environnement (je sais, c'est une drôle d'idée ). Le but est d'afficher la commande puis le résultat.

    En gros, le script, qu'on appellera mon_script.sh, contient ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # mon_script.sh
    echo "Nous allons exécuter la commande suivante : ${COMMAND}"
    ${COMMAND}
    En soi, ça ne parait pas sorcier.
    Par exemple, si la commande consiste à chercher le texte "super" dans toto.txt (qui contient une ligne "c'est super chouette"), ça donnera ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    export COMMAND="grep super toto.txt"
    ./mon_script.sh
    et la sortie doit donner ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nous allons exécuter la commande suivante : grep Super toto.txt
    C'est super chouette
    Là où ça se gâte, c'est si je veux chercher la chaîne "super chouette". J'aurais tendance à faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export COMMAND="grep \"super chouette\" toto.txt"
    avec les \" pour indiquer que c'est bien le caractère guillemet que je veux
    ou alors ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export COMMAND="grep 'super chouette' toto.txt"
    avec les simples guillemets autour de la chaîne cherchée.

    Mais, dans les deux cas, alors que la syntaxe donne ce que je veux dans le terminal, la sortie via mon_script.sh donne alors ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nous allons exécuter la commande suivante : grep "super chouette" toto.txt
    grep chouette" : No such file or directory
    Si j'utilise des guillemets simples
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export COMMAND="grep 'super chouette' toto.txt"
    alors j'ai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nous allons exécuter la commande suivante : grep 'super chouette' toto.txt
    grep chouette' : No such file or directory
    Si directement dans la fenêtre je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep super\ chouette toto.txt
    ça marche.

    Par contre, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export COMMAND="grep super\\ chouette toto.txt"
    j'ai cette fois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Nous allons exécuter la commande suivante : grep super\ chouette toto.txt
    grep: Trailing backslash
    Bref, c'est à devenir fou .

    Et je ne parle même pas d'un pipe dans la commande ou d'une redirection, j'ai l'impression que ce n'est même pas la peine d'y penser.

    Auriez-vous une petite idée pour me sortir du pétrin ?

    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    Par défaut
    Auriez-vous une petite idée pour me sortir du pétrin ?
    oui.
    ne pas faire ça.

    utilise une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ maFonc () (PS4=' '; echo -n "vous allez exécuter :"; set -x; "$@")
    $ maFonc grep -i 'lorem ipsum' ./lorem\ ipsum
    vous allez exécuter : grep -i 'lorem ipsum' './lorem ipsum'
        "Lorem ipsum" dolor sit amet, consectetur adipiscing elit.
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    $
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    Bonjour, .... heu ....
    pour évaluer une commande sous forme de string, c'est pas justement eval ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "super chouette" > toto.txt ; ma_commande='grep "super chouette" "toto.txt"' ; eval "$ma_commande"
    super chouette
    Par contre ce que là je ne m'explique pas encore, c'est que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "super chouette" > toto.txt ; ma_commande='grep "super chouette" "toto.txt"' ; eval "$ma_commande" ; echo "pas chouette" > toto.txt ; eval "$ma_commande"
    super chouette
    je m'attendais à lire "pas chouette"
    Pourquoi ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    Par défaut
    eval c'est mal.
    Je ne l'envisage jamais, parce que cette commande n'existe pas dans mon vocabulaire shell.

    je m'attendais à lire "pas chouette"
    pourquoi ?
    le fichier a été modifié (le contenu précédent a été écrasé), mais la commande est la même.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    eval c'est mal.
    Je ne l'envisage jamais, parce que cette commande n'existe pas dans mon vocabulaire shell.
    (moi non plus soit dit en passant, ça m'a passé)
    Citation Envoyé par N_BaH Voir le message
    evalle fichier a été modifié (le contenu précédent a été écrasé), mais la commande est la même.
    ??? mais la commande reste la même oui, mais le fichier est différent dans son contenu, elle ne relit pas le fichier ?
    (comme si le résultat était encapsulé une fois pour toute dans ma_commande quelque soit le nombre d'appels ???)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    Par défaut
    fais des cat du fichier, avant chaque commande, ce sera plus évident.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "chouette" > toto.txt ; ma_commande='grep "chouette" "toto.txt"' ; eval "$ma_commande" ; echo "je cat ... " && cat toto.txt; echo "pas chouette" > toto.txt ; echo "je vérife cat ..." && cat toto.txt ; echo "je ré éval: " && eval "$ma_commande"
    j'étais à la masse

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Dens1 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "chouette" > toto.txt ; ma_commande='grep "chouette" "toto.txt"' ; eval "$ma_commande" ; echo "je cat ... " && cat toto.txt; echo "pas chouette" > toto.txt ; echo "je vérife cat ..." && cat toto.txt ; echo "je ré éval: " && eval "$ma_commande"
    Pourquoi tout mettre sur une seule ligne ?
    Je trouve que ça ne facilite pas la lecture.

  9. #9
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    bonjour,
    oui c'est vrai, mais ça prend la tête de faire l'indentation une fois collé entre les balises CODE. (mais je ferai autrement, c'est pas beaucoup plus compliqué d'envoyer dans un fichier, d'indenter, et revenir coller *^^)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    Par défaut
    en définissant FCEDIT=$(which vim), ça devrait aller assez rapidement, si tu connais un peu vim. Sinon, ce sera l'occasion de t'y mettre.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    merci
    je ne connais pas du tout vim (enfin, à part de nom), j'utilise nano quand j'ai besoin d'éditer vite fait.
    Excellent en effet
    ps: par contre petit souci, après avoir tester FCEDIT="/usr/bin/nano" pour ouvrir l'historique dans nano (ok), j'ai unset FCEDIT (ok =""),
    or si je tape maintenant fc sans option , ça m'ouvre la dernière commande ans un fichier tmp via nano, au lieu de me l'afficher simplement sur stdout

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 642
    Par défaut
    le but de fc est justement d'éditer la dernière commande par défaut.

    je n'utilise plus nano, et je n'utilise pas d'éditeur en mode graphique.

    je ne fais pas de mélanges : ce qui se passe dans le terminal reste dans le terminal.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Commande avec arguments dans une architecture MVVM
    Par johnaliashead dans le forum Silverlight
    Réponses: 7
    Dernier message: 26/07/2010, 16h18
  2. Sommer avec conditions dans une variable
    Par nmicoud dans le forum iReport
    Réponses: 1
    Dernier message: 15/07/2009, 14h34
  3. Insertion de variable avec guillemets dans une table SQL
    Par jnico21200 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/03/2009, 14h36
  4. Réponses: 4
    Dernier message: 28/03/2008, 09h09
  5. [MySQL] executer une commande php contenu dans une variable
    Par Stopher dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/11/2006, 15h44

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