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 :

Revenir au path initial depuis une fonction


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut Revenir au path initial depuis une fonction
    Bonjour
    J'utilise trois fonctions afin de mettre à jour mon système.
    Exemple:
    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
     
    build_base() {
     while true; do
         echo -n "Build base system? (y/n) [y] "
         read answer
         case $answer in
         ""|y|Y)
                doas rm -rf /usr/obj/* && cd /usr/src && doas make obj && doas make build && cd ~-
                if [ $? -eq 0 ]; then
                    echo "›› Base system built."
                else
                    echo "›› Unable to build base system!"
                fi
                return 0
                ;;
            n|N)
                echo "GoodBye!"
                break
                ;;
              *)
                echo "$answer: is not allowed!"
                ;;
         esac
     done
    }
    J'utilise également:afin de revenir au path initial.

    Cependant, j'utilise deux autres fonctions fonctionnant sur le même principe afin de mettre à jour d'autres parties du système. Je me pose donc la question suivante, serait-il plus judicieux de créer une fonction du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    return_path() {
    cd -~
    }
    et de l'appeler lorsque cela est nécessaire. Qu'en pensez-Vous ?
    .Olivier

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    D'abord, merci. Je ne connaissais pas cette abréviation cd ~-. Je m'embêtais à envoyer le message dans la poubelle par un horrible cd - &>/dev/null.

    Ensuite, dans un script, il serait plus propre d'écrire le nom du dossier dans lequel tu veux aller. Même par une variable.

    En console, tu auras du mal à faire plus efficace que de taper seulement 5 caractères ... donc la fonction sera moins bien que l'original.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    D'abord, merci. Je ne connaissais pas cette abréviation cd ~-.
    D'ailleurs, le signe - n'est pas utile . le ~ est un alias de /home/utilisateur.

    Merci pour tes explications.
    .Olivier

  4. #4
    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
    Attention à l'enchaînement des commandes avec un "&" dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                doas rm -rf /usr/obj/* && cd /usr/src && doas make obj && doas make build && cd ~-
    si doas rm -rf /usr/obj/* && cd /usr/src n'échoue pas, mais que doas make obj ou doas make build échoue, alors le cd ~- ne sera pas effectué.
    Ce code ne garantit donc pas dans tous les cas un retour au répertoire de départ.
    De plus, on a le même problème si "doas" est une fonction qui peut aussi changer de répertoire.

    Sinon, une autre manière de protéger le directory courant consiste à créer un sous-shell (avec des parenthèses):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         case $answer in
         ""|y|Y)
                (doas rm -rf /usr/obj/* && cd /usr/src && doas make obj && doas make build)
                if [ $? -eq 0 ]; then
                    echo "›› Base system built."
                else
                    echo "›› Unable to build base system!"
                fi
                return 0
                ;;
    qu'on peut d'ailleurs abréger en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                if (doas rm -rf /usr/obj/* && cd /usr/src && doas make obj && doas make build); then
                    echo "›› Base system built."
                else
                    echo "›› Unable to build base system!"
                fi
    Citation Envoyé par Olivier Regnier Voir le message
    D'ailleurs, le signe - n'est pas utile . le ~ est un alias de /home/utilisateur.
    Euh... "~-" est l'avant-dernier répertoire visité (juste avant le dernier "cd"), alors que "~" est le home directory de l'utilisateur courant.

    Il se peut que ces 2 répertoires soient le même... ou pas...

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Surtout que "cd" sans paramètre revient au répertoire utilisateur. Pas besoin d'écrire "cd ~".
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Merci à tous les deux pour toutes ces explications
    .Olivier

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 387
    Points
    19 387
    Par défaut
    je ne suis pas au fait des processus de compilation, mais je viens de lire un sujet sur un autre forum où make est utilisé avec une option -C qui « change de répertoire avant de lire les makfiles ou de faire quoi que ce soit d'autre »; ça permettrait de ne pas effectuer de changement de répertoire...

    ça ne me plaît pas de changer de répertoire dans un script.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti

    Homme Profil pro
    https://framagit.org/ericb/documents
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : https://framagit.org/ericb/documents

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 305
    Points
    305
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    Je n'ai pas testé avec make, mais avec le shell bash, pour revenir dans le répertoire de départ, j'utilise les commandes builtin pushd et popd

    Limite (d'après la page de man de bash) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If DIRSTACK is unset, it loses its special properties, even if it is subsequently
                  reset.

    J'ai mis un petit exemple (créer un fichier test.sh contenant ces lignes), pour tester le fonctionnement de pushd et popd avec le shell bash :

    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
    #!/bin/bash
     
    origin=`pwd`
     
    pushd $origin 2/dev/null
     
    mkdir un_rep
    cd un_rep
     
    for ((i=0 ; i<10 ; i++))
      do touch file${i}
    done
     
    current=`pwd`
     
    echo Le script est lancé dans le répertoire $current
     
    echo "je reviens maintenant à mon point de départ ..."
    # retourne dans le répertoire initial
    popd
     
    echo À la fin, je suis dans le répertoire : `pwd`
    Bonnes fêtes à tous !


    --
    qɔᴉɹə

    L'association EducOOo : http://www.educoo.org

    https://framagit.org/ericb

    https://github.com/ebachard

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/02/2007, 06h30
  2. Réponses: 2
    Dernier message: 13/12/2006, 11h37
  3. [AS2] Atteindre attribut d'une classe depuis une fonction interne a la classe
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/04/2006, 21h03
  4. Retourner un tableau depuis une fonction
    Par obalais dans le forum C++
    Réponses: 2
    Dernier message: 20/10/2005, 16h49
  5. Ecrire dans un tableau html depuis une fonction js ?
    Par botanica dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/10/2005, 12h48

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