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 :

[bash] ne pas substituer le caractère "*"


Sujet :

Linux

  1. #21
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    Solution avec sed : j'y avais bien pensé mais je cherchais une solution "tout bash" peut être plus élégante

    Solution "set -f/+f" : ça marche nickel
    Ce qui donne dans mon script de test :
    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
     
    $ cat test.sh
    #!/bin/sh
    # test.sh
    VAR="config.h *.c~ *.sh"
    ret=""
     
    set -f
    for v in $VAR
    do
            ret+=" -x $v";
    done
    set +f
     
    echo "je devrais avoir:"
    echo "diff -ur  -x config.h -x *.c~ -x *.sh old new"
    echo "et je l'ai effectivement:"
    echo "diff -ur $ret old new"
    Concernant les demandes de précision de lilian_h :

    Le script est en fait l'outil cygport, un outils de fabrication des paquets cygwin.
    Il possède une commande DIFF qui permet de générer un patch entre la version de référence et la version modifiée du paquet.
    Cette commande fait un "diff -ur ..." entre 2 arbo et c'est celle-ci qui me pose problème (le source est consultable ici)
    Il est possible d'indiquer les fichiers à ignorer (.bak, .*~ etc) en définissant une variable DIFF_EXCLUDES dans le fichier de configuration du paquet.

    Voici un extrait du code (actuellement ligne 226)
    ${default_excludes} et ${DIFF_EXCLUDES} correspondent à ${VAR} de mon exemple
    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
     
     226 for exclude in ${default_excludes}
     227 do
     228         diff_excludes_x+=" -x ${exclude}";
     229 done
     230 
     231 case ${DIFF_EXCLUDES} in
     232         -x*)
     233                 diff_excludes_x+=" ${DIFF_EXCLUDES}";
     234                 ;;
     235         *)
     236                 for exclude in ${DIFF_EXCLUDES}
     237                 do
     238                         diff_excludes_x+=" -x ${exclude}";
     239                 done
     240                 ;;
     241 esac
    Et comme je l'ai écrit précédemment, si je l'entoure entre un set -f / set +f, cela fonctionne.

  2. #22
    Membre averti
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Points : 328
    Points
    328
    Par défaut
    Ravi pour la solution, et merci pour les précisions.

    Mais:

    Solution avec sed : j'y avais bien pensé mais je cherchais une solution "tout bash" peut être plus élégante
    En quoi utiliser sed dans un shell script n'est-il pas élégant ?

    Lilian.

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par pfxxx Voir le message
    Solution avec sed : j'y avais bien pensé mais je cherchais une solution "tout bash" peut être plus élégante
    Mauvaise stratégie. Le shell est limité parce que ses programmeurs savent qu'il existe tout un tas d'outils divers et variés permettant tous les traitements que l'on veut et qu'on peut facilement récupérer le résultat en shell. Et ces outils, écrits en C et compilés, sont autrement plus rapide que le shell.

    T'auras tout avantage à essayer de déporter au maximum tes actions.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i=1
    while test $i -le 20
    do
        echo $i
        i=`expr $i + 1`
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in $(seq 20)
    do
        echo $i
    done
    Tu peux lancer les deux. Je te laisse deviner lequel est le plus rapide.

    Ton vrai travail sera de savoir quel outil utiliser, et entre deux, utiliser le plus rapide. Ma première version de mon exemple qui rajoute les "-x" utilisait awk (très lent). Ensuite, j'ai rectifié et remplacé par un sed (plus rapide)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 49
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par lilian_h Voir le message
    Ravi pour la solution, et merci pour les précisions.
    Mais:
    En quoi utiliser sed dans un shell script n'est-il pas élégant ?
    Lilian.
    Simplement, je pensais qu'il y avait une construction possible en bash que j'ignorais peut être.

    Mais je ne suis pas sectaire : si il faut du sed, awk ou autre, je fais avec.

    En tout cas, merci pour vos différentes remarques et suggestions

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Importation de données caractères avec quote
    Par caro92 dans le forum SAS Base
    Réponses: 3
    Dernier message: 25/11/2015, 09h59
  2. Réponses: 3
    Dernier message: 08/06/2007, 14h16
  3. ne peut pas simplement "aXSLProc.Process(aCursor);"
    Par didier.cabale dans le forum XMLRAD
    Réponses: 16
    Dernier message: 08/03/2006, 12h25

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