[Résolu] variables d'environnement

thesuixx
[Résolu] variables d'environnement

Bonjour,
je travaille actuellement sur un gros projet java gérant un certain nombre de fichiers qui sont rangés dans différents dossiers.
Une contrainte qui m'a été imposé est que les fichiers traités ainsi que les exécutables se trouvent dans la même arborescence, qu'on choisit au moment de l'installation,

on aura donc par exemple le dossier monProgramme dans lequel se trouve tout le programme+les fichiers traités etc

En revanche, à l'intérieur du dossier, les emplacements des fichiers et exécutables sont entièrement paramétrables grâce à un fichier de configuration dans lequel apparaissent les chemins vers les différents répertoires de stockage des fichiers traités et exécutables.

Le problème c'est que tous ces chemins doivent être écrits en absolu vu qu'on ne peut pas savoir où dans le dossier monProgramme se trouvent les exécutables. Du coup, lors de l'installation du programme, il faut aller dans le fichier de configuration et refaire tout les chemins ce qui est bien con :/

Alors ce que je voudrais faire c'est, au moment de l'installation, définir une variable d'environnement $monProgramme contenant l'adresse du dossier monProgramme/, donc je n'aurai plus besoin de mettre des chemin de fichiers en absolu, il suffirait de les mettre en relatif depuis monProgramme/ puis , dans le programme java, j'interroge le système, je récupère le chemin du dossier monProgramme/ et je concatène les chemins relatifs du fichier de config pour obtenir les chemins absolus

la question est donc: comment créer des variables d'environnement (cygwin/linux) persistantes (qui restent lors du reboot ou du relancement de linux)

mon ami Google m'a dit qu'il existe un fichier contenant toutes les commandes à lancer lors du démarrage de linux et qu'il suffit d'ajouter mon setenv ou define (ou autre) dans ce fichier. Le problème, c'est que apparemment, toujours d'après Google, ce fichier n'est pas le même d'une distrib à l'autre et j'émets des doutes pour le fonctionnement sous cygwin

voila voila,

fredericmazue

Pour sûr qu'il y a des différences entre les Unixes, mais on l'occurence pour ton problème ça parait facile, n'est déplaise à Google :)

Si tu veux que les variables d'environnement soient spécifiques à chaque utilisateur, tu les définis dans le fichier .bashrc (je dis bien .bashrc, avec un point au début, le point faisant d'ailleurs que le fichier est caché par défaut) du répertoire utilisateur. Par exemple:

/home/utilisateur/.bashrc

Si tu veux que les variables soient les mêmes pour tous le monde, tu les définis dans le fichier /etc/profile

Ces deux fichiers existent et sont exploités dans tous les Unixes de l'univers connu et inconnu, y compris sous Cygwin :)

thesuixx

super, merci beaucoup, voila un problème de résolu :)

malheureusement maintenant vient la deuxième question (car il y en a toujours une): existe t-il une commande sous linux qui permette d'accéder à ce fichier automatiquement ?

je m'explique: je pense faire un installateur qui me colle mon dossier et crée de manière définitive ma variable d'environnement, la question est donc: suis je obligé d'écrire un petit script ou programme en C qui accède au fichier, se place en fin de fichier et écrit ma variable, ou bien existe il une commande qui édite automatiquement ce fichier (car si mon install plante pendant l'édition du fichier, et que des données du fichier sont perdues, je veux pas savoir la gueule de l'OS au prochain boot :/)

Un truc genre

echo "export $pathMonPrg=/home/tsx/monPrg" >> /etc/profile"
fredericmazue

echo >> ça le fait, c'est même très courant en Unix
Mais là où je ne suis pas d'accord c'est que ton exemple met dans /etc/profile une variable qui pointe sur un répertoire utilisateur (je suppose que tsx = thesuixx :) ) et ça c'est pas politiquement correct. Dans ce cas fais:

echo "export $pathMonPrg=/home/tsx/monPrg" >> /home/tsx/.bashrc

thesuixx

ok merci beaucoup de ton aide, avec ça je vais pouvoir faire un bel installateur pour mon prog :)

EDIT: je n'arrive pas à récupérer la variable d'environnement dans mon prg JAVA, j'ai d'abord essayé System.getenv("maVariable") et System.getenv("$maVariable") mais ça ne marche pas, et en affichant toutes les variables de System avec
System.getProperties().list(System.out);
j'ai constaté que maVariable n'y était pas, (je suppose que System ne contient pas du tout les variables d'env Unix mais bien au contraire une sorte de variables d'env réservées à JAVA et non accessibles depuis le shell &Cie)

du coup j'ai essayé ca :

public String getenv(String env){
        String s=null;
        Process p = null;
        // post-condition
        if (env != null) {
            try {
                Runtime r = Runtime.getRuntime();
                p = r.exec("echo $"+env);
                synchronized (p) {
                    InputStream is = p.getInputStream();

                    byte[] b = new byte[64];
                    int i;
                    s="";
                    while (0 < (i = is.read(b))) {
                        s+=new String(b, 0, i);
                        System.out.print(new String(b, 0, i));
                    }
                    int e = p.waitFor();
                }
            } catch (Exception e) {
                System.out.println("=> erreur d'execution <echo " + env + "> " + e.toString());
            }
        }
        return s;
    }

qui me renvoie $maVariable au lieu du contenu de cette variable.
fredericmazue

Quote:
je suppose que System ne contient pas du tout les variables d'env Unix mais bien au contraire une sorte de variables d'env réservées à JAVA et non accessibles depuis le shell &Cie

A prioiri tu devrais avoir accès à toutes les variables. Si la JVM ne la voit pas, c'est qu'il y a un petit problème au lancement.

thesuixx

hmm.. d'un coup ça marche, ça marchait pas ce matin et là c'est impec alors que j'ai rien changé
des fois, l'info c'est magiK :P

merci beaucoup à toi, je pense que le sujet est définitivement résolu cette fois-ci

@+
Cordialement: The SuixX