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. #21
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Je n'ai pas tout compris et ça devient rapidement très compliqué.
    ben en gros on veut éviter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ctac_@debian-linux:~/Documents/~/dir with spaces$
                       ^           ^
    Documents/ et dir with spaces/ devraient être au même niveau dans l'arborescence, à la racine du répertoire personnel $HOME/ qu'on écrit aussi ~/, le propos c'est donc d'interpréter le tilde comme étant une référence au homedir, sachant qu'on a y compris des variantes du genre ~user ou ~+ (man bash, Tilde Expansion)

  2. #22
    Membre chevronné
    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
    Par défaut
    Salut,
    Ok, j'avais pas vraiment vu le problème.
    man bash, Tilde Expansion
    Merci, ça m'a fait un peu de lecture.

    Bon, je pense que là, ça fonctionne et c'est assez simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~ctac_/dir with spaces"
    ls "$(sh -c "echo $dir")"
    file1  file2  file4
    On peut remplacer sh par bash ou $SHELL
    Cordialement.

  3. #23
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Bon, je pense que là, ça fonctionne et c'est assez simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir="~ctac_/dir with spaces"
    ls "$(sh -c "echo $dir")"
    file1  file2  file4
    On peut remplacer sh par bash ou $SHELL
    Est-ce que ça marche aussi pour un dir comme ça:

  4. #24
    Membre chevronné
    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
    Par défaut
    Salut,
    Est-ce que ça marche aussi pour un dir comme ça:
    dir='/; rm -rf /'
    C'était pour le principe.
    Cette fois, un dir comme ça passe aussi.
    Enfin, je comprends pas, j'ai un écran noir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function expandtilde
    {
    	rep="${1#~*/}"
    	tilde="${1%*$rep}"
    	ret="$($SHELL -c "echo $tilde")"
    	echo $ret$rep
    }
     
    rep=$(expandtilde "$1")
    [ -d "$rep" ] && ls "$rep" || echo pas un rep $rep
    Cordialement.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    quid de ~toto/machin devant pointer sur /home/toto/machin ?

    la solution la plus efficace et élégante reste à mon sens celle de disedorgue au post #19 à coup de printf "%q" + eval

    sinon comme répertoire de test on préfèrera peut-être ~user/;ls plutot qu'un rm (hashtag débutantsquipasseraientparlà)

  6. #26
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Et je ne conseille pas d'utiliser cette méthode avec par exemple une syntaxe du style dir='~$(ls)/xx'.

  7. #27
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Et pour ceux, qui comme moi, se disent que par contre, on ne peut pas faire un rm -rf / ou moins méchant un ls -l / à cause du '/' qui est le délimiteur, n'ont qu'à essayer avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dir='~$(`printf  "%b" "\154\163\040\055\154\040\057"`)/xx'
    ps: pas d'inquiétude, celle-ci réalise le moins méchant

  8. #28
    Membre chevronné
    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
    Par défaut
    Bonjour,
    la solution la plus efficace et élégante reste à mon sens celle de disedorgue au post #19 à coup de printf "%q" + eval
    Trés instructive effectivement
    J'ai quand même essayer 2,3 trucs, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X="$(ls /)"
    printf -vY "%q\n" "$X"
    echo "$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
    Et là, j'obtiens un magnifique listing de ma racine !
    Cordialement.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    ben moi je la recommande ta méthode, quelque soit le contenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ dir='~$(`printf  "%b" "\154\163\040\055\154\040\057"`)/xx'
    $ printf -vY "%q\n" "$dir"
    $ echo $'\n'"$(Y=${Y//\\\\ / };eval echo ${Y/\\~/\~})"
     
    ~$(`printf  "%b" "\154\163\040\055\154\040\057"`)/xx
    le rm -rf / tel quel ne passe pas de toutes façons sans l'option --no-preserve-root, c'est surtout pour le principe...

    Citation Envoyé par ctac_ Voir le message
    Et là, j'obtiens un magnifique listing de ma racine !
    oui, c'est à cause des double quotes, et si tu fais un echo $X avant le printf il a déjà été interprété

  10. #30
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Perso, ce n'est pas la méthode du printf "%q" + eval, que je remettais en cause, je n'ai pas trouvé de cas faillible pour celle-ci (mais je ne dis pas qu'il n'y en a pas).

    Par contre, c'est plus celle proposé par ctac_ où il était facile de faire un simple ls mais surtout de montrer que l'on peut aussi cacher les caractères à des commandes de replace simple.

    Pour le rm --no-preserve-root -rf /, suffit de l'écrire sous forme octal: \162\155\040\055\055\156\157\055\160\162\145\163\145\162\166\145\055\162\157\157\164\040\055\162\146\040\057

  11. #31
    Membre chevronné
    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
    Par défaut
    Salut,
    Une avec sed qui me semble secure mais ... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/^/echo /;s#/#/'#;s/$/'/;e" <<<"$dir"
    Cordialement.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Une avec sed qui me semble secure mais ... ?
    mais dir='~/`ls`'

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

Discussions similaires

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

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