La question dit tout. J'utilise actuellement Arch Linux et le zsh, mais j'aimerais une solution qui (au minimum) fonctionne à la fois sur les VT et dans les xterms et aussi (espérons-le, de préférence) continuera à fonctionner si je change de distributions ou de shells.
J'ai entendu des réponses extrêmement disparates à cette question dans différents documents de distributions. Ubuntu dit "utilisez .pam_environment". Je pense que dans Arch, ce qu'ils recommandent dépend de votre shell. Actuellement, je mets tout dans .profile et si un shell ne source pas cela pour une raison quelconque (par exemple bash si .bash_profile existe), je remplace cela en le sourcing manuellement. Mais il semble qu'il doit y avoir un meilleur moyen.
shell
environment-variables
login
combattant
la source
la source
Réponses:
Il n'y a malheureusement aucun emplacement entièrement portable pour définir les variables d'environnement. Les deux fichiers qui se rapprochent le plus sont
~/.profile
, qui est l'emplacement traditionnel et fonctionne dès le départ sur de nombreuses configurations, et~/.pam_environment
, une alternative moderne, courante mais limitée.Que mettre
~/.pam_environment
Le fichier
~/.pam_environment
est lu par toutes les méthodes de connexion qui utilisent PAM et qui ont ce fichier activé. Cela couvre la plupart des systèmes Linux de nos jours.Le principal avantage
~/.pam_environment
est que (lorsqu'il est activé), il est lu avant le démarrage du shell de l'utilisateur, il fonctionne donc quel que soit le type de session, le shell de connexion et d'autres complexités. Il fonctionne même pour les connexions non interactives telles quesu -c somecommand
etssh somecommand
.La principale limitation
~/.pam_environment
est que vous ne pouvez y mettre que des affectations simples, pas une syntaxe de shell complexe. La syntaxe de ce fichier est la suivante.export
et un seul espace (pas un onglet, allez comprendre).VAR=VALUE
où VAR se compose de lettres, de chiffres et de traits de soulignement.#
démarre un commentaire, il ne peut pas apparaître dans une valeur.'
ou"
et contient une autre citation identique, alors VAR est défini sur la chaîne entre les guillemets (tout ce qui suit la deuxième citation est ignoré). Sinon, VAR est défini sur la chaîne après le=
signe.=
, la variable est supprimée de l'environnement.Donc, à la hausse,
~/.pam_environment
fonctionne dans un large éventail de circonstances. En revanche, vous ne pouvez pas avoir de paramètres dynamiques tels que baser la valeur d'une variable sur une autre variable (par exemple, ajouter un répertoire à PATH) ou utiliser la sortie d'une commande (par exemple, tester si un répertoire ou un programme est présent), et certains les caractères (#'"
, nouvelle ligne) sont impossibles ou gênants à mettre dans la valeur.Que mettre
~/.profile
Ce fichier doit avoir une syntaxe sh portable (POSIX). N'utilisez des extensions ksh ou bash (tableaux,
[[ … ]]
etc.) que si vous savez que votre système possède ces shells en tant que/bin/sh
.Ce fichier peut être lu par des scripts dans des applications automatisées, il ne doit donc pas appeler de programmes qui produisent une sortie ou un appel
exec
. Si vous souhaitez le faire sur les connexions en mode texte, faites-le uniquement pour les shells interactifs. Exemple:Ceci est un exemple d'utilisation
/bin/sh
comme shell de connexion et de basculement vers votre shell préféré. Voir aussi comment utiliser bash comme shell de connexion lorsque mon administrateur système refuse de me laisser le changerQuand n'est-il
~/.profile
pas lu lors de la connexion non graphique?Différents shells de connexion lisent différents fichiers.
Si votre shell de connexion est bash
Bash lit
~/.bash_login
ou~/.bash_profile
s'ils existent à la place de~/.profile
. Bash ne lit pas non plus~/.bashrc
dans un shell de connexion même s'il est interactif. Pour ne plus jamais avoir à vous souvenir de ces bizarreries, créez un~/.bash_profile
avec les deux lignes suivantes:Voir aussi Quels fichiers de configuration doivent être utilisés pour configurer les variables d'environnement avec bash?
Si votre shell de connexion est zsh
Zsh lit
~/.zprofile
et~/.zlogin
, mais pas~/.profile
. Zsh a une syntaxe différente de sh, mais peut lire~/.profile
en mode d'émulation sh. Vous pouvez l'utiliser pour~/.zprofile
:Voir aussi Zsh ne frappant pas ~ / .profile
Si votre shell de connexion est un autre shell
Il n'y a pas grand-chose que vous puissiez faire là-bas, à part utiliser
/bin/sh
comme shell de connexion et votre shell préféré (comme le poisson) comme shell interactif uniquement. C'est ce que je fais avec zsh. Voir ci-dessus pour un exemple d'appel d'un autre shell à partir de~/.profile
.Commandes à distance
Lors de l'appel d'une commande à distance sans passer par un shell interactif, tous les shells ne lisent pas un fichier de démarrage.
Ksh lit le fichier spécifié par la
ENV
variable, si vous parvenez à le transmettre.Bash lit
~/.bashrc
s'il n'est pas interactif (!) Et son processus parent est appelérshd
ousshd
. Ainsi , vous pouvez commencer votre~/.bashrc
avecZsh lit toujours
~/.zshenv
quand il démarre. À utiliser avec prudence, car il est lu par chaque instance de zsh, même lorsqu'il s'agit d'un sous-shell où vous avez défini d'autres variables. Si zsh est votre shell de connexion et que vous souhaitez l'utiliser pour définir des variables uniquement pour les commandes distantes, utilisez un garde: définissez une variable dans~/.profile
, commeMY_ENVIRONMENT_HAS_BEEN_SET=yes
, et vérifiez cette garde avant de lire~/.profile
.Le cas des connexions graphiques
De nombreuses distributions, gestionnaires d'affichage et environnements de bureau s'arrangent pour s'exécuter
~/.profile
, soit en les approvisionnant explicitement à partir des scripts de démarrage, soit en exécutant un shell de connexion.Malheureusement, il n'y a pas de méthode générale pour gérer les combinaisons distro / DM / DE qui
~/.profile
ne sont pas lues.Si vous utilisez une session traditionnelle démarrée par
~/.xsession
, c'est l'endroit où vous devez définir vos variables d'environnement; faites-le par sourcing~/.profile
(ie. ~/.profile
). Notez que dans certaines configurations, les scripts de démarrage de l'environnement de bureau seront à~/.profile
nouveau source .la source
case $- in *i*)
fait?;;
ouesac
) si$-
correspond au modèle*i*
, c'est-à-dire si$-
contienti
, c'est-à-dire si le shell est interactif.$-
est une chaîne des options shell actuellement définies. (commeset -x
).i
signifie shell interactif.~/.config/env
, même sans émulation?.profile
conformité avec des obus Bourne assez vieux, mais je reconnais que certaines personnes s'en moquent. Je n'ai rien contre les gens qui supposent que sh = bash pour leurs propres fichiers, je m'en soucie seulement s'ils publient un#!/bin/sh
script qui utilise les fonctionnalités de bash.Autant que je sache, il n'existe pas de norme agnostique de distribution et de shell pour définir les variables d'environnement.
La norme la plus courante et de facto semble être
/etc/profile
et~/.profile
. Le deuxième plus courant semble être/etc/environment
et~/.pam_environment
.Il me semble que toute la documentation que je vous ai trouvée existe déjà. Je les énumère ici de toute façon pour les autres lecteurs.
/etc/profile
et~/.profile
( lien )./etc/environment
et~/.pam_environment
( lien )./etc/profile
et/etc/environment
( lien ).Bonus: un texte interrogeant l'utilisation et / ou la mauvaise utilisation de
/etc/environment
Debian ( lien , dernière mise à jour 2008).la source
sh
? Tant que vous vous en tenez à POSIX, j'aurais pensé que vouscsh
et amis de la manière POSIX (vous avez besoin de quelque chose commeset
ousetenv
)J'ai ajouté le script suivant ~ / bin / agnostic_setenv:
Et dans ~ / .perl-homedir j'utilise:
Un script similaire pour agnostic_unsetenv:
la source