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 :

Récupérer le répertoire du script en cours d'exécution


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut Récupérer le répertoire du script en cours d'exécution
    Bonjour,

    Je suis en train de faire un script qui doit savoir où il est, car il va travailler sur des fichiers dont il connait la position par rapport à lui même.

    J'ai trouvé de nombreuses solutions sur le web, mais aucune ne m'a satisfaite.



    Donc si vous avez d'autres solutions, merci d'avance.

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Passé il y a quelques jours :

    http://www.developpez.net/forums/d82...ipt-execution/



    edit: et le lien direct vers la solution :
    http://www.developpez.net/forums/d79...r/#post4586928

    Et pour bien te former voir les Cours et tutoriels pour bien apprendre Scilab : http://scilab.developpez.com/cours/

  3. #3
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Merci pour cette réponse rapide !

    Mais cela ne me convient pas. readlink a besoin de deviner de quel fichier on parle. Si le script est lancé depuis un autre répertoire avec un chemin relatif (rep/script.sh), le fichier n'est pas trouvé. La solution qui vient à l'esprit est alors readlink $0. Mais comme précisé dans ma question, $0 n'est pas toujours utilisable.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par rt15 Voir le message
    Bonjour,

    Je suis en train de faire un script qui doit savoir où il est, car il va travailler sur des fichiers dont il connait la position par rapport à lui même.

    J'ai trouvé de nombreuses solutions sur le web, mais aucune ne m'a satisfaite.



    Donc si vous avez d'autres solutions, merci d'avance.
    ne convient pas ?

    (ce ne sera évidemment pas un path canonisé… )

  5. #5
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Bien tenté, mais non plus.

    Classiquement ça marche très bien, mais le souci est qu'on appelle nos scripts de manière à ce qu'ils s'exécutent dans le shell courant, comme les scripts "configure" :

    Et dans ces cas là, $0, c'est "bash", donc inutilisable...

    [ edit ]
    Je dois aussi supporter le cas suivant :
    Ce cas n'est pas géré sur le ./configure dans lequel j'ai jeté un oeil :
    bash: error: cannot find sources (src/version.c) in . or ..

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par rt15 Voir le message
    Bien tenté, mais non plus.

    Classiquement ça marche très bien, mais le souci est qu'on appelle nos scripts de manière à ce qu'ils s'exécutent dans le shell courant, comme les scripts "configure" :

    Et dans ces cas là, $0, c'est "bash", donc inutilisable...
    oui c'est le seul cas qui ne fonctionne pas tel quel…
    mais on peut le détecter car dans le fichier sourcé le $BASH_ARGV contient le nom du programme alors qu'il est vide dans les autres cas…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if [ "$BASH_ARGV" == "" ]
    then
    	path=$PWD/$0
    else
    	path=$PWD/$BASH_ARGV
    fi

  7. #7
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Merci encore, mais ce n'est pas encore ok... Mais y a de l'idée !

    Le problème étant que BASH_ARGV n'est pas inclus dans les vielles versions de bash (2.0.3, 2.0.5...). Y aurait pas une autre variable qui donne plus ou moins la même chose ?

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par rt15 Voir le message
    Merci encore, mais ce n'est pas encore ok... Mais y a de l'idée !

    Le problème étant que BASH_ARGV n'est pas inclus dans les vielles versions de bash (2.0.3, 2.0.5...). Y aurait pas une autre variable qui donne plus ou moins la même chose ?
    accédez à un de ces anciens bash et mettez une ligne
    au début d'un script … et comparez le résultat entre les exécutions "sourcée" et "normale" …

  9. #9
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Arf... Il y a beaucoup de différences, mais ce qui est sûr c'est qu'aucune variable ne contient un équivalent de $0 ou de BASH_ARGV... Donc même si j'arrivais à faire la différence entre les modes, je ne pourrais pas déterminer le bon chemin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if [ Un truc pas très propre ]
    then
    	path=$PWD/$0
    else
    	path=$PWD/??????????
    fi

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    il ne vous reste plus qu'à imposer une variable d'environnement contenant le path en question pour les bash pre-BASH_ARGV…

    si aucune des deux variables n'est définie… vous sortez avec un message d'erreur…

  11. #11
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Bin c'est à peu près ce qu'on fait à l'heure actuelle : faut setter une XXXX_HOME avant de lancer le script. Mais je voulais m'en passer car c'est assez fastidieux (Et cependant trop changeant pour un mettre une valeur en dur dans un .bashrc ou autre), mais visiblement ce n'est pas possible sur nos vieux serveurs...

    En tout cas merci d'avoir consacré ton temps à ma question.

  12. #12
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Je veux pas être méchant, mais je pense qu'il faudrait revoir l'algo

    Le problème dans ton exemple, c'est la possibilité de lancer le script avec "."

    Je ne connais pas en détail le fonctionnement du bash, mais pour moi, si tu fais . test/test.bash, ben tu n'as aucun moyen de savoir d'où est lancé ton script, puisqu'il n'est justement pas vraiment lancé... mais plutôt interprété au fur et à mesure... donc c'est mort.

    Je pense que tous les autres cas peuvent être traité, mais pas source (que je n'avais pas vu au début) !

    Toutefois, cette phrase m'interpelle:
    car il va travailler sur des fichiers dont il connait la position par rapport à lui même
    Si il connait la position par rapport à lui même, il n'a donc justement pas besoin de savoir où il est puisque les positions deviennent absolues par rapport à sa propre position ?!

  13. #13
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    Je veux pas être méchant, mais je pense qu'il faudrait revoir l'algo
    Bin globalement, je cherche à faire un script "configure" classique qui met en place l'environnement pour que l'on puisse ensuite taper un certain nombre de commandes qui vont exploiter cet environnement. Sauf que d'habitude, ce genre de script est exécuté alors qu'il est dans le répertoire courant :
    Alors que le mien devrait pouvoir être exécuté depuis n'importe quel répertoire, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    . ./UnOuDeuxRepToutAFaitAléatoires/configure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si il connait la position par rapport à lui même, il n'a donc justement pas besoin de savoir où il est puisque les positions deviennent absolues par rapport à sa propre position ?!
    Le souci c'est que les fichiers sont cherchés à partir du répertoire courant, et pas celui du script. Donc même si le script "sait" qu'il y a toto.sh dans le même répertoire que lui, il ne peut cependant pas l'exécuter en faisant simplement toto.sh.

    Voilà un script fic1 qui appelle un script fic2 qui affiche blah.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >mkdir subdir
    >cd subdir/
    >echo "fic2.sh" > fic1.sh
    >echo "echo blah" > fic2.sh
    >chmod a+rx *
    >. ./fic1.sh
    blah
    >cd ..
    >. ./subdir/fic2.sh
    blah
    >. ./subdir/fic1.sh
    bash: fic2.sh: command not found
    >
    Ci-dessus, fic2.sh est cherché dans le répertoire courant, pas dans le répertoire de fic1.sh. On est obligé d'appeler fic1 en se plaçant dans son répertoire pour que cela fonctionne.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Le problème ici, c'est que tu source tes scripts, si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cd subdir
    $ echo "./$(dirname $0)/fic2.sh" > fic1.sh
    $ ./fic1.sh
    blah
    $ cd ..
    $ ./subdir/fic1.sh
    blah
    ...
    ?

    Tu peux sourcer fic2.sh depuis fic1.sh, mais pas fic1.sh depuis le shell.

    D'ailleurs, si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo -e ". ./$(dirname $0)/fic2.sh\necho $var" > subdir/fic1.sh
    $ echo -e "var=blabla\necho blah" > subdir/fic2.sh
    $ subdir/fic1.sh
    blah
    blabla
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Cependant je suis bien obligé de sourcer, vu que mon script est un genre de .bashrc.

  16. #16
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par rt15 Voir le message
    Cependant je suis bien obligé de sourcer, vu que mon script est un genre de .bashrc.
    l'habitude avec les produits OpenSource, c'est de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ./configure [options]
    make [install]
    le tout exécuté toujours à partir du répertoire d'installation et de nulle part ailleurs…

    est-ce que vous ne vous compliquez pas inutilement la tâche en vous posant des contraintes qui n'ont pas lieu d'être ?

  17. #17
    Membre actif
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Points : 289
    Points
    289
    Par défaut
    Ca ressemble au paradoxe de la poule et de l'oeuf ....

  18. #18
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    est-ce que vous ne vous compliquez pas inutilement la tâche en vous posant des contraintes qui n'ont pas lieu d'être ?
    L'objectif était de se compliquer la tâche une bonne fois pour toute maintenant de manière à la simplifier plus tard (ie, ne pas avoir à se déplacer dans le répertoire qui va bien pour le restant de nos jours).

    D'autre part, sur le plan théorique, être en mesure de faire "un script qui devine son propre emplacement en toute circonstance", ça me paraît pas déconnant dans tout un tas de cas...

  19. #19
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par rt15 Voir le message
    L'objectif était de se compliquer la tâche une bonne fois pour toute maintenant de manière à la simplifier plus tard (ie, ne pas avoir à se déplacer dans le répertoire qui va bien pour le restant de nos jours).

    D'autre part, sur le plan théorique, être en mesure de faire "un script qui devine son propre emplacement en toute circonstance", ça me paraît pas déconnant dans tout un tas de cas...
    certes…
    mais ce qui est une contrainte inutile c'est de vouloir couvrir le cas du "sourcing" du script :
    car cette façon de faire est contraire aux habitudes… et c'est ce seul cas qui pose problème…

    on exécute toujours le script principal de configuration … et lui, éventuellement, "source" des scripts de paramètres…

  20. #20
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Avril 2009
    Messages : 26
    Points : 31
    Points
    31
    Par défaut
    Bonjour à tous,

    De mon côté, j'ai voulu créer un menu pouvant être lancé de manières suivantes :
    menu
    ./menu
    /chemin/menu
    . menu


    Pour arriver à mes fins, j'ai dû créer un script faisant office de lanceur du script principal et devant être présent dans la varaible PATH :

    /chemin/menu
    exit

    Ceci me permet (dans les 3 premiers cas) de lancer le menu et de revenir sur la ligne de commande après l'avoir quitté.
    Le quatrième cas empêche d'avoir la ligne de commande, exit me déconnecte totalement de la machine, en le plaçant dans le ". profile" et en bloquant les interruptions, cela empêche totalement certains utilisateurs d'avoir accès à la ligne de commande.

    Essaie de coupler les 2 idées : la commande pwd pour la recherche de fichiers et le lanceur de scripts.

    As-tu pensé aux alias ?

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

Discussions similaires

  1. Récupérer le chemin du module en cours d'exécution
    Par mdriesbach dans le forum Général Python
    Réponses: 6
    Dernier message: 09/07/2010, 09h50
  2. Récupérer le répertoire du script
    Par horec dans le forum Linux
    Réponses: 1
    Dernier message: 02/11/2009, 15h59
  3. Récupérer chemin absolu du script en cours d'exécution
    Par greatmaster1971 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 15/09/2008, 09h07
  4. Arrêter un script en cours d'exécution
    Par trucentete dans le forum Administration système
    Réponses: 2
    Dernier message: 04/09/2008, 19h40
  5. Réponses: 2
    Dernier message: 29/01/2004, 11h05

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