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 :

Utiliser la commande cd avec une variable comme nom de dossier


Sujet :

Shell et commandes GNU

Vue hybride

patlabar Utiliser la commande cd avec... 14/09/2021, 11h30
N_BaH Bonjour, pourquoi ? le... 14/09/2021, 13h38
patlabar C'est pour ensuite y... 14/09/2021, 15h17
Flodelarab Bonjour :coucou: La... 14/09/2021, 15h46
N_BaH le mieux (aîe, je vais encore... 14/09/2021, 17h09
patlabar J'ai opté pour cette option.... 14/09/2021, 17h52
jack-ft Tout dépend de ce que tu... 17/09/2021, 11h52
Flodelarab $ echo "$(pwd)"... 17/09/2021, 12h34
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Par défaut Utiliser la commande cd avec une variable comme nom de dossier
    Bonjour,

    Je n'ai pas trouvé de réponse malgré mes recherches.

    J'écris un script en shell bash.

    Je demande à l'utilisateur un nom pour créer ensuite un dossier avec ce nom : nom_dossier
    Je souhaite ensuite y copier un répertoire puis me déplacer dans le dossier créé.

    J'arrive à créer le dossier, y copier un autre dossier mais je n'arrive pas à me déplacer vers ce dossier.

    Voici ce que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    read -p 'Entrez le nom du dossier : ' dossier
    mkdir "$dossier"
    cp -r test "$dossier"/
     
    cd "${dossier}"
    Il y a d'après mes recherches un problème avec la manière dont cd interprète les variables mais je sèche.

    A vos avis.

    Patrick

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

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

    puis me déplacer dans le dossier créé.
    pourquoi ?

    le déplacement est bien réalisé dans le script (tu peux le vérifier en ajoutant un pwd), mais quand le script s'arrête le contexte précédent est restauré.

    NB : ici, les accolades autour des variables sont inutiles.
    il y a des cas où elles le sont, voire indispensables, mais pas là.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Par défaut
    puis me déplacer dans le dossier créé.

    C'est pour ensuite y travailler, mais je peux sans doute adapter mes autres commandes pour faire ce que j'ai à faire dans le dossier traité.

    Là, ce que je ne comprenais pas c'est qu'en créant une variable dans mon terminal et en essayant d'y accéder avec la commande :
    c'était ok et pas à l'intérieur de mon script.

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    La technique est de sourcer le script. Comme ça, pas de différence shell/sous-shell.

    ou

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 644
    Par défaut
    le mieux (aîe, je vais encore me faire taper sur les doigts)

    je préfère ne pas changer de répertoire dans un script.
    je ne sourcerais pas mon script pour un cd, quand je peux simplement dire où effectuer les opérations.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2019
    Messages : 17
    Par défaut
    J'ai opté pour cette option.

    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    La technique est de sourcer le script. Comme ça, pas de différence shell/sous-shell.

    ou
    Merci pour la proposition mais je ne comprends pas comment "sourcer" le script.

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Citation Envoyé par patlabar Voir le message
    Merci pour la proposition mais je ne comprends pas comment "sourcer" le script.
    Les 2 lignes de code que j'ai postées et que tu as citées ne sont pas là pour faire guirlandes.

    Et j'en rajoute une troisième :

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par patlabar Voir le message
    puis me déplacer dans le dossier créé.

    J'arrive à créer le dossier, y copier un autre dossier mais je n'arrive pas à me déplacer vers ce dossier.
    Tout dépend de ce que tu entends par "me"... (qui a dit "Meuh ?)

    Voici ce que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    read -p 'Entrez le nom du dossier : ' dossier
    mkdir "$dossier"
    cp -r test "$dossier"/
     
    cd "${dossier}"
    Il y a d'après mes recherches un problème avec la manière dont cd interprète les variables mais je sèche.
    Le problème n'est pas avec la manière dont cd interprète les variables, mais plutôt entre l'écran et la chaise, ainsi que l'explique N_BaH:

    Citation Envoyé par N_BaH Voir le message
    le déplacement est bien réalisé dans le script (tu peux le vérifier en ajoutant un pwd), mais quand le script s'arrête le contexte précédent est restauré.
    Citation Envoyé par patlabar Voir le message
    C'est pour ensuite y travailler, mais je peux sans doute adapter mes autres commandes pour faire ce que j'ai à faire dans le dossier traité.

    Là, ce que je ne comprenais pas c'est qu'en créant une variable dans mon terminal et en essayant d'y accéder avec la commande cd $dossier, c'était ok et pas à l'intérieur de mon script.
    Au vu des réponses, j'ai peur que ce ne soit pas complètement clair pour toi. Voici mon interprétation:

    Lorsque tu écris des commandes dans le terminal, il y a un processus shell qui interprète ces commandes.
    Ce processus possède, entre autres:
    • un numéro, que tu peux voir en tapant echo $$ dans le terminal,
    • et un contexte d'exécution, qui contient notamment le répertoire courant, et que tu peux voir en tapant la commande pwd dans le terminal.


    Lorsque tu lances une commande, par exemple, en tapant ./monscript.sh dans le terminal, le shell courant (le terminal) crée un NOUVEAU processus (appelé processus fils) qui exécute les commandes contenues dans le script. Tu peux le vérifier en modifiant légèrement ton script de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    echo "Processus n° $$ dans le répertoire $(pwd)"
     
    read -p 'Entrez le nom du dossier : ' dossier
    mkdir "$dossier"
    cp -r test "$dossier"/
     
    cd "${dossier}"
     
    echo "Processus n° $$ dans le répertoire $(pwd)"
    De cette façon, tu verras le nouveau processus, ainsi que son répertoire d'exécution, et tu constateras, grâce à la dernière ligne que le changement de répertoire a bien été effectué... pour le processus courant, celui qui a exécuté le script !

    Si tu exécutes, dans le terminal, la série de commandes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "Processus du terminal n° $$ dans le répertoire $(pwd)"
    ./monteste.sh
    echo "Processus du terminal n° $$ dans le répertoire $(pwd)"
    tu constateras que tout s'est bien passé pour le processus fils et que le répertoire courant du contexte du processus père (du terminal) n'a PAS été modifié.

    Si tu exécutes, dans le terminal, la série de commandes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "Processus du terminal n° $$ dans le répertoire $(pwd)"
    source ./monteste.sh
    echo "Processus du terminal n° $$ dans le répertoire $(pwd)"
    tu constateras que, grâce au source:
    • il n'y a pas création d'un processus fils car le numéro dans le script est le même que le numéro dans le terminal.
    • le répertoire courant du contexte du processus du terminal a effectivement été modifié.


    Dans ton cas, si tu souhaites donner à l'utilisateur la possibilité de créer un répertoire et de s'y déplacer, la solution que j'utiliserais (il y en a peut-être d'autres) serait de créer une fonction et un alias.

    Par exemple, dans le ~/.bashrc ou dans le ~/.bash_profile, tu mets quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    alias mkcd=mkdirandcd
     
    function mkdirandcd() {
      echo "Processus n° $$ dans le répertoire $(pwd)"
     
      read -p 'Entrez le nom du dossier : ' dossier
      mkdir "$dossier"
      cp -r test "$dossier"/
     
      cd "${dossier}"
     
      echo "Processus n° $$ dans le répertoire $(pwd)"
    }
    Ensuite, il faut, une fois et une seule fois pour la vie, soit te déloguer et reloguer, soit créer un nouveau terminal, soit sourcer le fichier modifié source ~/.bashrc pour pouvoir, pour toutes les sessions ultérieures, taper directement au terminal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "Processus du terminal n° $$ dans le répertoire $(pwd)"
    mkcd
    echo "Processus du terminal n° $$ dans le répertoire $(pwd)"
    Voilà !

    J'espère que la longueur n'entrave pas la clarté !

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "$(pwd)"
    /home/jeanlouischefdeplato/mondossier
    $ echo "$PWD"
    /home/jeanlouischefdeplato/mondossier

Discussions similaires

  1. Réponses: 7
    Dernier message: 31/08/2018, 14h43
  2. Réponses: 6
    Dernier message: 14/06/2018, 10h01
  3. [AC-2013] RechDom() avec une Variable comme Nom de Champ
    Par (2t0m) dans le forum Access
    Réponses: 1
    Dernier message: 26/09/2013, 14h07
  4. [PHP 5.2] Récupérer une variable POST avec une variable comme nom
    Par bailamos dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2008, 14h59
  5. [curseurs] utiliser une variable comme nom de champ
    Par Christian31 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2005, 14h12

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