Où déclarer les variables d'environnement?

59

Quels sont les bons endroits pour:

  1. Des variables d'environnement globales censées affecter tous les utilisateurs?
  2. Variables d'environnement spécifiques à l'utilisateur?
Ivan
la source

Réponses:

16

Je pense que la page wiki de la communauté sur les variables d'environnement vous aidera à faire le tri

Sagarchalise
la source
2
Le problème est que le document lié est confus et / ou tout à fait faux dans la partie des variables spécifiées par l'utilisateur. J'essaie toujours de trouver un moyen de le faire sans aucun scrupule. $ HOME / .profile est probablement le meilleur pari ...
Rmano
16
Veuillez coller du texte ou prendre un instantané du contenu lié - il pourrait ne plus être disponible à l'avenir!
Nam G VU
4
Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
Thomas Ward
75

Pour ajouter à la réponse de sagarchalise, je peux résumer ce que le lien suggère comme lieux appropriés pour les paramètres.

Pour les paramètres globaux, variables d'environnement à l'échelle du système

  • Utilisation /etc/environment
  • Ne pas utiliser /etc/profileou/etc/bash.bashrc

De la page:

/etc/environment[...] est spécifiquement conçu pour les paramètres de variable d'environnement à l'échelle du système. Ce n'est pas un fichier de script, mais plutôt une expression d'affectation, une par ligne. Plus précisément, ce fichier stocke les paramètres régionaux et de chemin d'accès à l'échelle du système.

L'utilisation /etc/profileest un moyen très Unix-y, mais sa fonctionnalité est grandement réduite sous Ubuntu. Il n’existe que de pointer /etc/bash.bashrcet de recueillir des entrées /etc/profile.d.

Sur mon système, la seule entrée intéressante dans profile.d est /etc/profile.d/bash_completion.sh.

Pour les paramètres locaux ou par utilisateur

Une version précédente de la page Ubuntu était recommandée ~/.pam_environment, mais la page suggère actuellement que si cela ne fonctionne pas, vous devez utiliser

  • ~/.profile - C’est probablement le meilleur fichier pour placer des assignations de variables d’environnement, car il est exécuté automatiquement par le DisplayManager lors de la session de travail du processus de démarrage ainsi que par le shell de connexion lorsqu’on se connecte à partir de la console textuelle.

  • ~/.bash_profileou ~./bash_login- Si l'un d'entre eux existe, bash l'exécute au lieu de ~/.profiledémarrer bash en tant que shell de connexion. Bash préférera ~/.bash_profileà ~/.bash_login. [...] Ces fichiers n'influenceront pas une session graphique par défaut. "

  • ~/.bashrc - "... peut être le lieu le plus facile pour définir des variables".
Belacqua
la source
1
Quels programmes lisent /etc/environmentet quand? Il ne semble pas fonctionner avec cron, même lors de l'utilisationSHELL=/bin/bash
SystemParadox
1
Il semble que / etc / environment fasse partie de PAM, ce qui signifie qu’il doit définir l’environnement par défaut pour tous les processus. cron est spécial (c'est-à-dire cassé) pour écraser spécifiquement cet environnement avec le sien.
SystemParadox
Alors, comment se comporte .bashrc? après bash_profile? au lieu de .profile?
opensas
1
@opensas Vous devriez probablement poser une question distincte en vous référant à celle-ci ou à la réponse.
Belacqua
@belacqua laisse dire que j'ai besoin d'ajouter 2 variables d'environnement ou plus pour /etc/environmentaimer JAVA_HOME="/opt/java" et ANT_HOME="/opt/ant" comment le faire
Kasun Siyambalapitiya
7

Tu as:

/ etc / profile: fichier .profile à l'échelle du système pour le shell Bourne (sh (1)) et les shells compatibles avec Bourne (bash (1), ksh (1), cendres (1), ...).

qui dans Lucid et Maverick courir

/etc/profile.d/*.sh

si présent, et si le shell de l'utilisateur est bash:

/etc/bash.bashrc

Pour l’environnement utilisateur, il existe un tableau spécifique au shell qui porte à confusion et s’il est considéré comme un "shell de connexion". Si le shell est bash:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

pour sh / dash:

$HOME/.profile

pour zsh, je ne vais même pas essayer de donner un sens à cela .

msw
la source
5

Comme recommandé sur https://help.ubuntu.com/community/EnvironmentVariables :

  1. Les variables d'environnement globales censées affecter tous les utilisateurs doivent entrer /etc/environment.

  2. Les variables d'environnement spécifiques à l'utilisateur doivent être définies dans ~/.pam_environment.

Évitez les fichiers profile et rc pour la définition de variables d’environnement sur Ubuntu. Ils m'ont causé plus de maux de tête que ce qu'ils valent.

C'est plus facile à dire qu'à faire cependant;)

Il est possible que vous rencontriez le même problème de configuration que celui qui existait pour moi. Voir la solution de contournement pour la maison cryptée ci-dessous.

Mon ~/.pam_environment:

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

Pourquoi le chemin statique laide? ${PATH}ne fonctionnerait pas pour moi. J'ai bricolé mon identifiant plusieurs fois en essayant de le contourner, donc je m'en tiens à la copie statique laide des valeurs par défaut :)

Solution de contournement pour les dossiers de départ cryptés

Dans les versions Ubuntu jusqu’à Precise 12.04 Bêta 2 inclus, si vous utilisez un répertoire personnel chiffré, vous devez le modifier /etc/pam.d/common-sessionpour le charger ~/.pam_environment. Cette solution fonctionne apparemment pour les versions précédentes, mais je ne l’ai pas testée.

Guenther Montag (g-montag) a écrit le 2010-08-19:

Cela semble être un problème avec les répertoires de départ cryptés. J'ai ajouté

session requise pam_env.so

à la fin de /etc/pam.d/common-session et maintenant ~ / .pam_environment est lu. Sur un autre système sans répertoires personnels cryptés (également 10.04), la solution de contournement n’est pas nécessaire. Peut-être que dans mon cas, le système essaiera de lire ~ / .pam_environment avant qu'il ne soit déchiffré.

Adapté de ma réponse sur Super User: https://superuser.com/a/408373/66856

Alain O'Dea
la source
C'est toujours faux: ${HOME}ça ne marchera pas non plus. Il n'y a pas d'expansion dans .pam_environment.
Détly
2
@detly, il y a une expansion dans .pam_environment, mais HOMEn'est pas réglé si tôt que d'habitude. Si cette ligne avait été lue DEFAULT=${PATH}/Applications/jdk, vous auriez vu la valeur de PATHinsérée dans celle-ci.
Muru