Forum Programmation.shell Comment concaténer des chemins de façon plus simple sous Bash ?

Posté par  (site web personnel) .
Étiquettes : aucune
0
28
sept.
2010
Bonjour tout le monde !

Pour modifier des variables comme LD_LIBRARY_PATH ou PYTHONPATH, je regarde si la variable existe, auquel cas je concatène la valeur courante avec ma nouvelle valeur séparée par un ':'. Sinon je crée tout simplement une nouvelle variable.


NEW_PATH='/path/to/new/path'
if [ $LD_LIBRARY_PATH ]
then
export LD_LIBRARY_PATH=$NEW_PATH:$LD_LIBRARY_PATH
else
export LD_LIBRARY_PATH=$NEW_PATH
fi


Cette méthode est un peu lourde quand elle se répète souvent dans un script. Existe-t-il une astuce pour simplifier cette syntaxe ?

Merci beaucoup !
  • # plop

    Posté par  . Évalué à 4.

    export LD_LIBRARY_PATH=$NEW_PATH${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}

    2 rien
    • [^] # Re: plop

      Posté par  (site web personnel) . Évalué à 1.

      Merci beaucoup !

      Je peux demander une explication sur la syntaxe employée ?
      • [^] # rtfm

        Posté par  . Évalué à -1.

        man bash
    • [^] # Re: plop

      Posté par  . Évalué à 3.

      C'est concis, mais illisible.
      En créant une fonction c'est moins "optimisé", mais lisible: concatenation '/path/to/new/path' $LD_LIBRARY_PATH
      • [^] # Re: plop

        Posté par  (site web personnel) . Évalué à 1.

        Je vois pas en quoi c'est illisible, c'est du bash standard, contrairement à ton exemple.
        • [^] # Re: plop

          Posté par  . Évalué à 1.

          Disons que comme il n'y a pas d'espace dans l'expression
          $NEW_PATH${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH} (et je ne sais pas si c'est autorisé) - C'est un peu dur de savoir si :+: est un operateur ou si c'est :+:$ ou :+ suivi de :$

          Je me suis amusé à chercher sous Google, et bien c'est pas "évident". J'ai essayé via man bash en faisaint une recherche mais il n'a pas trouvé, probablement à cause de la signification de : ou + (je ne suis pas un expert des regexps dans man/less/etc...)

          J'ai du faire ca dans Emacs, et j'ai trouver ca :

          ${parameter:+word}
          Use Alternate Value. If parameter is null or unset, nothing is
          substituted, otherwise the expansion of word is substituted

          Je pense que c'est la solution mais dans la réponse donnée au dessus, c'est :+:

          Pas évident - Donc la demande d'explication de syntaxe n'était pas si idiote

          Attention avant de répondre RTFM....
          • [^] # Re: plop

            Posté par  (site web personnel) . Évalué à 2.

            C'est dans man bash, qui est la seule référence décente en matière de bash. Effectivement c'est pas des plus simple à trouver, mais si tu lis les messages avec attention, tu verras que le RTFM n'émanait pas de moi :)

            Tout ce que je dis, c'est que cette syntaxe est du bash standard, du coup, dire que c'est illisible est un peu idiot... D'accord, la syntaxe de bash n'est pas toujours des plus claires, mais quitte à utiliser bash, autant l'utiliser complètement :)
          • [^] # Re: plop

            Posté par  (site web personnel) . Évalué à 2.

            > Je pense que c'est la solution mais dans la réponse donnée au dessus, c'est :+:

            Parce qu'il faut ajouter un ':' entre $NEW_PATH et $LD_LIBRARY_PATH ! Le "word" ajouté est ':$LD_LIBRARY_PATH'.
  • # Ajoute à la fin

    Posté par  (site web personnel) . Évalué à 2.

    A noter qu'il vaut mieux ajouter à la fin par défaut donc en général faire

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$NEW_PATH
    • [^] # Re: Ajoute à la fin

      Posté par  (site web personnel) . Évalué à 2.

      Sauf si tu cherche précisement a surcharger des librairies par d'autres versions

      Sinon vu le peu d'impact moi je me prendrais pas la tête avec des if/... effectivement
      export LD_LIBRARY_PATH=$NEW_PATH:$LD_LIBRARY_PATH
      marchera bien
      • [^] # Attention DANGER

        Posté par  . Évalué à 4.

        Salut,

        Effectivement ta méthode marchera bien... dans la plupart des cas.

        Si LD_LIBRARY_PATH n'est pas défini, tu vas te retrouver avec quelque chose comme ça :
        LD_LIBRARY_PATH=/nouveau/chemin:

        Ce qui fait que les bibliothèques dynamiques vont être recherchées d'abord dans /nouveau/chemin, puis dans le répertoire courant (impact du : à la fin), ce qui ne semble pas être l'effet recherché et qui peut être dangereux.

        A+
        JJD
        • [^] # Re: Attention DANGER

          Posté par  . Évalué à 2.

          Ouch ! Au debut, j'etais prêt a te contredire, parce que j'étais persuadé que le ':' à la fin n'ajoutait pas le répertoire courant dans la recherche, parce que après tout, le répertoire courant ca devrait être ':.' (separateur point), pas ':' (séparateur rien) .

          Et puis j'ai testé... bien vu. Mais pourquoi ce comportement étrange ?
          • [^] # Re: Attention DANGER

            Posté par  . Évalué à 2.

            Je ne sais absolument par si ce comportement est voulu : j'ai découvert ça en me faisant avoir.
            Il s'agit peut-être d'un bug (de la libc6 ?) mais je n'ai pas trouvé (ni beaucoup cherché) de rapport à ce sujet.
  • # Restons simples...

    Posté par  . Évalué à 3.

    Une solution ultra simple pour ajouter au début :
    LD_LIBRARY_PATH="${newpath_1}:${LD_LIBRARY_PATH}"
    LD_LIBRARY_PATH="${newpath_2}:${LD_LIBRARY_PATH}"
    # etc...
    LD_LIBRARY_PATH="${LB_LIBRARY_PATH%:}"

    Comme ça tu ne te casses pas avec des lignes ignobles, et tu vires le ':' seulement à la fin, au cas où le LD_LIBRARY_PATH initial était vide.

    Et si tu veux ajouter à la fin :
    LD_LIBRARY_PATH+=":${newpath_1}"
    LD_LIBRARY_PATH+=":${newpath_2}"
    # ...
    LD_LIBRARY_PATH="${LB_LIBRARY_PATH#:}"

    Voila...
    • [^] # Re: Restons simples...

      Posté par  (site web personnel) . Évalué à 1.

      Pas mal du tout, c'est une bonne idée. Dans mon cas, il s'agit de plusieurs variables différentes (LD_LIBRARY_PATH, PYTHONPATH, ainsi que d'autres spécifiques à des logiciels précis) que je ne modifie qu'une fois, donc la version en une ligne est bien adaptée. Mais je garde ton idée sous le coude pour d'autres cas. Merci beaucoup !
    • [^] # Re: Restons simples...

      Posté par  . Évalué à 2.

      On peut aussi ne pas se soucier des « : » en trop et les laisser, ça ne gêne pas la plupart des programmes, et il me semble que c'est standard.
    • [^] # Re: Restons simples...

      Posté par  (site web personnel) . Évalué à 2.

      c'est ce que je fais, et en plus c'est du bourne shell standard et portable.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.