Forum Programmation.shell utiliser des "sous programmes" en shell

Posté par .
Tags : aucun
1
24
juin
2012

Bonjour,
j'ai fais un petit programme en bash : un genre de surcouche pour mon gestionnaire de fenêtres, qui me permet les organiser, les déplacer, redimensionner au clavier.

Mais j'ai un problème, j'ai découpé mon programme en plusieurs fichiers / sous-programmes.
(un prog = une fonction rudimentaire)

Et donc, un programme peut en appeler d'autres, mais comment indiquer le chemin vers les sous-programmes ? (sachant que le lieux d'appel du programme peut changer, et que j'aimerais ne pas me servir de $PATH …)  ? (De plus, j'aimerais diffuser mon programme donc l'emplacement n'est pas "unique")

ex, le début de l'un de mes programmes qui organise les fenêtres intelligemment dans l'espace :

    #!/bin/sh 

    getNbWindows="get_number_of_window_for_workspace.sh"
    nbWorkspaces="get_number_of_worspaces.sh"
    getWindows="get_windows_on_workspace.sh"
    resize="do_resize_with_real_dimention.sh"
    move="do_move_in_real_space.sh"
    getDimension="get_util_dimension_for_screen.sh"

    #le code (qui se sert des programmes plus haut) 

J'avais pensé à mettre tous les chemins en " $HOME/bin/mon_prog" et à indiquer à l'utilisateur de le placer dans un fichier donc son $HOME/bin (ou faire un petit script qui le fait … ). Qu'en pensez vous ?

Merci

  • # import

    Posté par . Évalué à 2.

    Je crois qu'il y a la ce qu'il te faut :
    import en bash

  • # trop de découpage tue le découpage

    Posté par . Évalué à 4.

    Tu devrais plitot faire un seul fichier contenant toutes tes fonctions et ensuite les appeler depuis chaque programme "principal".

  • # hou la

    Posté par . Évalué à 4.

    avoir tout séparé en divers fichier me paraît un poil compliqué;

    Je ne sais pas combien de lignes fait chaque fichier mais je ne sais pas si c'est pertinent.

    Pour peu que ton programme principal appel 4 sous fonctions soit tu utilise le . prog.sh (ou srouce prog.sh) soit tu l'appelles par prog.sh, et en plus d'ouvrir un autre fichier tu lances un 2eme .sh

    moi j'aurai fait différemment, soit un fichier 'bibliothèque' qui contient les utilitaires et des programmes ensuite qui source la bibliothèque (de préférence dans le même répertoire) ,

    soit un seul fichier (là ça dépend du nombre de lignes) et des liens symbolique vers ce même fichier avec des noms différents, et un comportement dépendant du nom du programme) ou une gestion du passage de paramètres.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: hou la

      Posté par . Évalué à 4.

      soit un seul fichier (là ça dépend du nombre de lignes) et des liens symbolique vers ce même fichier avec des noms différents, et un comportement dépendant du nom du programme) ou une gestion du passage de paramètres.

      J'aurais fait comme ça, mais je ne l'ai pas proposé pour ne pas embrouiller le P.I (je ne connais pas son niveau en programmation).

  • # Tu confonds fichiers, programmes et fonctions bash.

    Posté par . Évalué à 3.

        getNbWindows="get_number_of_window_for_workspace.sh"
        nbWorkspaces="get_number_of_worspaces.sh"
        getWindows="get_windows_on_workspace.sh"
        resize="do_resize_with_real_dimention.sh"
        move="do_move_in_real_space.sh"
        getDimension="get_util_dimension_for_screen.sh"
    
    

    tu devrais plutôt avoir :

    # contenu de get_number_of_window_for_workspace.sh
    function getNbWindows()
    {}
    
    
    # import des fonctions.
    [ -f get_number_of_window_for_workspace.sh ] && . get_number_of_window_for_workspace.sh || ( echo missing file get_number_of_window_for_workspace.sh; exit 1 )# use of function getNbWindows defined by
    # get_number_of_window_for_workspace.sh
    

    Pour l'histoire du chemin, perso pour mon .bashrc, j'utilise .bash.d.
    Tu peux alors faire :

    # bashrc extract
    
    # base dir.
    if [ -z "$BASH_BIN" ]; then
       BASH_BIN=~/.bash.d
    fi
    # import various bash functions.
    if [ -d "$BASH_BIN" ]; then
      for i in $BASH_BIN/*.sh; do . $i; done
    fi
    
    

    Ce qui simplifie grandement la gestion des imports et la mise à dispo des nouvelles fonctionnalités.
    BASH_BIN peut être défini ailleurs que dans le script ou prendre la valeur par défaut que tu auras spécifié.

  • # Reponse tardive

    Posté par . Évalué à 1.

    Euh, en fait pour mon "$way=….", j'ai trouvé une réponse dans un magazine linux que j'ai lu récemment.
    Eux ils font :

    REPERTOIRE_DU_SCRIPT=$(cd $(dirname $0); pwd)
    
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.