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 :

~ vs /home/userName et subsitution d'une partie de chaine par une variable


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut ~ vs /home/userName et subsitution d'une partie de chaine par une variable
    Bonjour,

    En bash,

    1) J'aimerai comprendre précisément la différence entre ~ et /home/userName
    Si on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var=~/monRep
    echo $var
    le ~ est remplacé par /home/userName
    Si quelqu'un a une explication ou un lien sur une ?

    2) Cette différence résulte sur le problème concret suivant :
    Je tente d'écrire un script qui lit dans un fichier un chemin puis utilise ce chemin. C'est dans un sous-shell et le ~ fait que le chemin n'est pas reconnu. Il l'est si c'est /home/userName.
    Je n'arrive pas à substituer dans une variable une partie de chaine par une variable. Ceci avec sed car je ne connais pas awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #! /bin/bash -x
    pathVar="~/monDir"
    pathVar2="~/monDir"
    racine="/home/`whoami`"
    pathVar=`echo "$pathVar" | sed 's/~/\/home\/userName/'`
    pathVar2=`echo "$pathVar2" | sed 's/~/$racine/'`
    après exécution (copie de l'affichage avec -x):
    pathVar=/home/userName/monDir
    pathVar2='$racine/monDir'

    Je comprends que $racine n'est pas substituer car entre '' mais je ne sais pas comment procéder.

    Merci pour votre aide,

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Bonjour,

    pas besoin de sed pour ça avec bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pathVar2="~/monDir"
    pathVar2="${pathVar2/#~/$HOME}"
    HOME n'a pas besoin d'être définie, c'est une variable interne de BASH.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Si tu fais pathVar2=$(echo "$pathVar2" | sed "s/~/$racine/"), ça devrait fonctionner...

    Pour convertir un chemin quel qu'il soit (relatif? abrégé, ...) en chemin absolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $(cd $monchemin ; pwd)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut
    Merci à tous les deux.

    al1_24, ta solution ne fonctionne malheureusement pas, elle me semblait naturelle à moi aussi, est resulte en :
    sed: -e expression n°1, caractère 6: option inconnue pour `s'

    N_BaH, ca fonctionne ! J'avais pas pensé à $HOME
    Néanmoins, mes référence livresque date un peu semble-t-il et je ne connais pas cette syntaxe.
    Apparemment les // font le même office que pour sed, mais qu'en est-il du # devant le ~ ?
    As-tu une référence qui détaille cela ?

    Pour le 1) ma question était pour être plus précis, pourquoi la correspondance avec /home/userName est perdu dans un sous-shell ?
    Bref de comprendre le mécanisme de substitution du ~ en /home/userName.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    puisque ~ est lu d'un fichier, il n'est pas interprété; c'est normal.
    de plus, ~ n'est pas non plus remplacé s'il est entre guillemets.

    Apparemment les // font le même office que pour sed, mais qu'en est-il du # devant le ~ ?
    As-tu une référence qui détaille cela ?
    man bash
    DÉVELOPPEMENTS
    Remplacement des paramètres
    ${paramètre/motif/chaîne}
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2010
    Messages : 18
    Par défaut
    Merci. Tout est clair maintenant !
    Il est vrai que je connais peu les spécificités du bash par rapport au Bourne.
    Mais avec tes explications, je progresse et sait où chercher !

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

Discussions similaires

  1. extraire une partie de chaine avec une seule ligne de commande sed
    Par kinkichin dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/07/2009, 10h28
  2. Remplacer une PARTIE de chaine de caractères dans un champ
    Par Turlututuchapopointu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/08/2005, 11h57
  3. grouper par une partie d'attribut
    Par vplf dans le forum Langage SQL
    Réponses: 19
    Dernier message: 21/01/2005, 16h31
  4. Réponses: 4
    Dernier message: 18/05/2004, 13h58

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