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 :

Expansion tardive du tilde


Sujet :

Shell et commandes GNU

  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut Expansion tardive du tilde
    J'ai cherché sur internet mais n'ai pas trouvé de réponse complètement satisfaisante.

    Supposons qu'une variable contienne le nom d'un répertoire ou d'un fichier, commençant par ~, par exemple, parce que c'est plus sympa à afficher.
    Y a-t-il moyen de demander au shell l'expansion a posteriori du tilde?

    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
    dir="~/TMP"
    echo "Votre dir est '$DIR'"
    => Votre dir est '~/TMP'   # ok. c'est ce que je veux
     
    echo "Votre dir '$DIR' contient:"
    => Votre dir '~/TMP' contient:   # ok. c'est toujours ce que je veux
     
    ls $DIR
    => ls: ~/TMP: No such file or directory # Pourtant ~/TMP existe... ou, au moins, $HOME/TMP
     
    cd $DIR
    => -bash: cd: ~/TMP: No such file or directory
     
    for f in $somedir/* ; do echo $f; done
    => ~jack/TMP/*   # Bof... je préfèrerais la liste des fichiers de $HOME/TMP
    J'ai trouvé des solutions partielles, comme:
    mais elle utilise eval (qui est dangereux... bon, a priori, je sais ce que j'ai mis dans "$dir"...)

    Et elle ne marche pas bien s'il y a des espaces:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~/dir with spaces"
    eval cd "$dir"
    => -bash: cd: /Users/jack/dir: No such file or directory
    Autre proposition, remplacer "~" par "$HOME", mais ça ne marche pas pour un autre home:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dir="~jack/TMP";
    cd ${dir/#\~/$HOME}
    => -bash: cd: /Users/jackjack/TMP: No such file or directory
     
    cd $(echo $dir | sed "s#^~#$HOME#")
    => -bash: cd: /Users/jackjack/TMP: No such file or directory
    J'ai bien réussi à bidouiller la première avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~jack/dir with spaces"
    eval "ls -ld $(echo "$dir" | sed -e 's|/\(.*\)|/"\1"|')"
    drwxrwxr-x  2 jack  staff  68 17 déc  2014 /Users/jack/dir with spaces/
    mais j'ai encore un appel à eval...

    Voyez-vous des bugs dans cette dernière solution?
    Connaissez-vous un moyen de faire sans eval?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Et que donne ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mydir='~/TMP'
    exp=$(cd "$mydir"; pwd)
    echo "'$mydir' est '$exp'"
    Désolé, je n'ai pas de machine *nix sous la main pour tester
    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.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Salut, il ne faut pas encadrer ~ de " sinon il n'est pas interpreté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cd "~"
    bash: cd: ~: Aucun fichier ou dossier de ce type
    cd ~
    => ok
    Sinon il faut utiliser ${HOME}.

    "${HOME}/Downloads" = ~/Downloads
    "${HOME}/Downloads 2" = ~/Downloads\ 2
    "${HOME}/Downloads 2" = ~"/Downloads 2"

    Ce n'est pas une bonne idée d'utiliser eval pour se déplacer :p
    Sous Kubuntu 20.04

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Bonjour,

    Si perl ne te rebute pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ DIR="~/Bibliothèque calibre"
    $ ls "$(perl -e 'print glob("\"$ARGV[0]\""),qq<\n>' "$DIR")"/*
    /home/disedorgue/Bibliothèque calibre/metadata.db  /home/disedorgue/Bibliothèque calibre/metadata_db_prefs_backup.json
     
    /home/disedorgue/Bibliothèque calibre/John Schember:
    Guide de demarrage rapide (1)
    Cordialement.

  5. #5
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    si c'est pour du perso, que les données entrantes sont contrôlées, eval est probablement la meilleure solution à envisager
    sinon, je vois pas d'autre moyen que de réimplémenter l'expansion du tilde, ça doit se faire assez facilement et les homedirs sont dispo dans /etc/passwd en lecture pour tout le système par défaut

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Et que donne ceci ?
    Ça donne exactement ce que j'ai indiqué à la ligne 12:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mydir='~/TMP'
    exp=$(cd "$mydir"; pwd)
    -bash: cd: ~/TMP: No such file or directory
    echo "'$mydir' est '$exp'"
    '~/TMP' est '/Users/jack'
    car le '~' n'est pas expansé...

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Salut, il ne faut pas encadrer ~ de " sinon il n'est pas interpreté.
    Oui, je sais (voir mon 1er message)!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cd "~"
    bash: cd: ~: Aucun fichier ou dossier de ce type
    cd ~
    => ok
    Oui, je sais (voir mon 1er message)!

    Sinon il faut utiliser ${HOME}.

    "${HOME}/Downloads" = ~/Downloads
    "${HOME}/Downloads 2" = ~/Downloads\ 2
    "${HOME}/Downloads 2" = ~"/Downloads 2"
    Oui, je sais (voir mon 1er message)!
    Mais je voudrais stocker une liste de répertoires à présenter à l'utilisateur sous une forme comme "~jack/dir with spaces" qui est plus agréable à regarder que la forme expansée, comme "/Users/jack/dir\ with\ spaces".
    Et ensuite, je veux retrouver la forme expansée à partir de la forme non expansée.

    Ce n'est pas une bonne idée d'utiliser eval pour se déplacer :p
    Oui, je sais (voir mon 1er message)!

  8. #8
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    for fnu, c'est pas dingue mais ça doit faire le job à peu près correctement, à tester :
    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
    function expandtilde {
       tildeprefix=$(grep -Po "^~.*?(?=/|$)" <<< "$1")
       tildeprefixlen=${#tildeprefix}
       if [ -n $tildeprefix ]; then
          if [ $tildeprefixlen != 1 ]; then
             homedir=$(awk -F: -vUSERNAME=${tildeprefix:1} '$1 == USERNAME {print $6}' /etc/passwd)
          else
             homedir=$HOME
          fi
       fi
       echo "${homedir}${1:$tildeprefixlen}"
    }
     
    dir="~testuser/testdir"
    echo "dir = $dir"
    expandtilde "$dir"
    (sinon +1 pour la solution Perl )

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    for fnu, c'est pas dingue mais ça doit faire le job à peu près correctement, à tester :
    Merci!
    Bon, ça fait pas les "~+N" et les "~-N", mais c'est pas grave...

    ça marche pas sous macos qui utilise Open Directory à la place de /etc/passwd...
    Oui, je sais, j'aurais dû poster dans "Shell et commandes POSIX"...


    (sinon +1 pour la solution Perl )
    et disedorgue pour la solution Perl

    Je passe en !

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    j'avais pas pigé en effet, désolé...
    J'ai lu trop vite sûrement.

    Mais bon maintenant que j'ai répondu à côté, je suis plus à une connerie prêt...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~/Download/Nouveau dossier/"
    cd "$(sed "s@~@${HOME}@" <<< "${dir}")"
    # =>/home/hizoka/Download/Nouveau dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~hizoka/Download/Nouveau dossier/"
    cd "$(sed "s@~${USER}@${HOME}@" <<< "${dir}")"
    # =>/home/hizoka/Download/Nouveau dossier
    PS :
    une liste de répertoires à présenter à l'utilisateur sous une forme comme "~jack/dir with spaces" qui est plus agréable à regarder
    Pas d'accord mais bon XD => ~jack beurk je trouve... mais ça ne rentre pas en ligne de compte...
    Sous Kubuntu 20.04

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par hizoka Voir le message
    j'avais pas pigé en effet, désolé...
    J'ai lu trop vite sûrement.
    Pas grave!

    Mais bon maintenant que j'ai répondu à côté, je suis plus à une connerie prêt...
    Je vois effectivement que tu es à peu près prêt pour une nouvelle... (Attention: Jipété nous surveille peut-être... )
    (belle allitération, non?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~hizoka/Download/Nouveau dossier/"
    cd "$(sed "s@~${USER}@${HOME}@" <<< "${dir}")"
    # =>/home/hizoka/Download/Nouveau dossier
    Oui, mais ça ne marche que pour l'utilisateur courant...
    Sinon, comme proposé par BufferBob, il faut parser le /etc/passwd (si le système en possède un...)

    PS :
    Pas d'accord mais bon XD => ~jack beurk je trouve... mais ça ne rentre pas en ligne de compte...
    Ben, généralement, je préfère taper, et donc aussi voir (faut être cohérent!), cd ~jack/... plutôt que le chemin complet.
    Il m'est d'ailleurs déjà arrivé de travailler chez des clients où le HOME est à 3 ou 4 niveaux de la racine / et où une partie du chemin dépend du groupe dont fait partie l'utilisateur, ce que je vois avec pwd, mais que j'aurais préféré ne pas voir!

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Il est vrai que ma vision de Linux se limite à mon pc perso et un serveur sur lesquels je fais ma petite tambouille, je n'ai jamais vu ce que c'était dans des sociétés ou des versions avec pas mal d'utilisateurs différents.

    C'est pour ça que je ne comprenais pas le coup de ~jack qui pour moi est toujours équivalent à /home/jack.

    Dommage j'étais content de mon sed

    En tout cas, merci pour les infos
    Sous Kubuntu 20.04

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function expandtilde {
       tildeprefix=$(grep -Po "^~.*?(?=/|$)" <<< "$1")
       tildeprefixlen=${#tildeprefix}
       if [ -n $tildeprefix ]; then
          if [ $tildeprefixlen != 1 ]; then
             homedir=$(awk -F: -vUSERNAME=${tildeprefix:1} '$1 == USERNAME {print $6}' /etc/passwd)
          else
             homedir=$HOME
          fi
       fi
       echo "${homedir}${1:$tildeprefixlen}"
    }
    Si sous MacOS, tu as aussi la commande lslogins (mais pas sure, puisqu'elle est typique linux et inspirée de la commande logins de FreeBSD)...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    expandtilde () 
    { 
        tildeprefix=$(grep -Po "^~.*?(?=/|$)" <<< "$1");
        tildeprefixlen=${#tildeprefix};
        if [ -n $tildeprefix ]; then
            if [ $tildeprefixlen != 1 ]; then
                homedir=$( lslogins --noheadings -o HOMEDIR -l ${tildeprefix:1} );
            else
                homedir=$HOME;
            fi;
        fi;
        echo "${homedir}${1:$tildeprefixlen}"
    }
    Cordialement.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Si perl ne te rebute pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ DIR="~/Bibliothèque calibre"
    $ ls "$(perl -e 'print glob("\"$ARGV[0]\""),qq<\n>' "$DIR")"/*
    /home/disedorgue/Bibliothèque calibre/metadata.db  /home/disedorgue/Bibliothèque calibre/metadata_db_prefs_backup.json
     
    /home/disedorgue/Bibliothèque calibre/John Schember:
    Guide de demarrage rapide (1)
    Une version plus courte et plus propre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls "$(perl -e 'print <"$ARGV[0]">,qq<\n>' "$DIR")"/*
    Cordialement.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Si sous MacOS, tu as aussi la commande lslogins
    inconnue au bataillon...

    Apparemment, il faut parser les fichiers de /var/db/dslocal/nodes/Default, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sudo defaults read /var/db/dslocal/nodes/Default/users/jack.plist "home"
    (
        "/Users/jack"
    )

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Juste à titre informatif, coté lubuntu, dans les scripts de complétion de bash, on trouve la fonction suivante:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # Example usage:
    #
    #    $ v="~"; __expand_tilde_by_ref v; echo "$v"
    #
    # Example output:
    #
    #       v                  output
    #    --------         ----------------
    #    ~                /home/user
    #    ~foo/bar         /home/foo/bar
    #    ~foo/$HOME       /home/foo/$HOME
    #    ~foo/a  b        /home/foo/a  b
    #    ~foo/*           /home/foo/*
    #
    # @param $1  Name of variable (not the value of the variable) to expand
    __expand_tilde_by_ref()
    {
        # Does $1 start with tilde (~)?
        if [[ ${!1} == \~* ]]; then
            # Does $1 contain slash (/)?
            if [[ ${!1} == */* ]]; then
                # Yes, $1 contains slash;
                # 1: Remove * including and after first slash (/), i.e. "~a/b"
                #    becomes "~a".  Double quotes allow eval.
                # 2: Remove * before the first slash (/), i.e. "~a/b"
                #    becomes "b".  Single quotes prevent eval.
                #       +-----1----+ +---2----+
                eval $1="${!1/%\/*}"/'${!1#*/}'
            else
                # No, $1 doesn't contain slash
                eval $1="${!1}"
            fi
        fi
    } # __expand_tilde_by_ref()
    Bon, comme je disais, cette fonction sert à la complétion, donc elle n'est pas totalement sécurisée.
    Par exemple si la variable X est défini comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X="~\$(ls)disedorgue/Bibliothèque calibre"
    Alors, la fonction exécutera la commande (ici ls) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ X="~\$(ls)disedorgue/Bibliothèque calibre"
    $ echo $X
    ~$(ls)disedorgue/Bibliothèque calibre
    $ cd /tmp
    $ __expand_tilde_by_ref X
    $ echo $X
    ~config-err-RymKkN spyder-disedorgue ssh-H2tzzArfdBS4 ssh-TBgKEFqOMmZv systemd-private-d4e21XX00X99XXd99d9aa7XX99XXX6b3-systemd-timesyncd.service-4MOFCCdisedorgue/Bibliothèque calibre
    Cordialement.

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    Citation Envoyé par hizoka Voir le message
    j'avais pas pigé en effet, désolé...
    J'ai lu trop vite sûrement.

    Mais bon maintenant que j'ai répondu à côté, je suis plus à une connerie prêt...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~/Download/Nouveau dossier/"
    cd "$(sed "s@~@${HOME}@" <<< "${dir}")"
    # =>/home/hizoka/Download/Nouveau dossier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~hizoka/Download/Nouveau dossier/"
    cd "$(sed "s@~${USER}@${HOME}@" <<< "${dir}")"
    # =>/home/hizoka/Download/Nouveau dossier
    PS :

    Pas d'accord mais bon XD => ~jack beurk je trouve... mais ça ne rentre pas en ligne de compte...
    Allez, en un seul sed (mais faut que celui-ci supporte le connecteur e lors du replace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo $X
    ~disedorgue/Bibliothèque calibre
    $ sed -e "s@.*@echo &@e" <<<"$X"
    /home/disedorgue/Bibliothèque calibre
    $ X="~/Bibliothèque calibre"
    $ sed -e "s@.*@echo &@e" <<<"$X"
    /home/disedorgue/Bibliothèque calibre
    Cordialement.

  18. #18
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Allez, en un seul sed (mais faut que celui-ci supporte le connecteur e lors du replace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -e "s@.*@echo &@e" <<<"$X"
    gg il est très peu documenté (comme son homologue en Perl d'ailleurs), on rappelle quand même qu'ils s'agit bien d'une évaluation là aussi, donc les risques sont similaires à eval


  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 282
    Points : 12 731
    Points
    12 731
    Par défaut
    OK, voici une méthode pour le moins sécure qui utilise eval...
    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
    $ X="~/Bibliothèque\ calibre"
    $ printf -vY "%q\n" "$X"
    $ echo "$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
    /home/disedorgue/Bibliothèque calibre
    $ X="~disedorgue/Bibliothèque\ calibre"
    $ printf -vY "%q\n" "$X"
    $ echo "$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
    /home/disedorgue/Bibliothèque calibre
    $ echo $PWD
    /home/disedorgue
    $ X="~+/Bibliothèque\ calibre"
    $ printf -vY "%q\n" "$X"
    $ echo "$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
    /home/disedorgue/Bibliothèque calibre
    $ echo $OLDPWD 
    /tmp
    $ X="~-/Bibliothèque\ calibre"
    $ printf -vY "%q\n" "$X"
    $ echo "$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
    /tmp/Bibliothèque calibre
    $ X="~-/Bibliothèque\ calibre/\$(ls);ls;\$(ls)"
    $ printf -vY "%q\n" "$X"
    $ echo "$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
    /tmp/Bibliothèque calibre/$(ls);ls;$(ls)
    Cordialement.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Je n'ai pas tout compris et ça devient rapidement très compliqué.
    eval, perl, sed ...
    Il me semble que si on explique clairement au shell ce que l'on veut, ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo $dir
    ~/dir with spaces
    ls ./"$dir"
    file1  file2
    cd ./"$dir"
    ctac_@debian-linux:~/Documents/~/dir with spaces$
    Bon, mais je suis peut être complétement a coté de la plaque.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Apache Debian tild
    Par ange91160 dans le forum Apache
    Réponses: 2
    Dernier message: 29/12/2006, 21h20
  2. Inscription universitaire tardive
    Par Ryadus dans le forum Etudes
    Réponses: 1
    Dernier message: 20/11/2006, 21h37
  3. Tild ' dans ACCESS
    Par TOPGUN89 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/08/2006, 09h32
  4. Problème : touche "tilde" ne fonctionne plus
    Par nicolas.charlot dans le forum Windows XP
    Réponses: 4
    Dernier message: 04/06/2006, 19h33
  5. [JTreeTable] expansion/collapse d'un noeud
    Par Hammer dans le forum Composants
    Réponses: 4
    Dernier message: 30/04/2003, 22h58

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