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 que su -c somecommand
et ssh 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.
- Les fichiers sont analysés ligne par ligne.
- Les espaces blancs de tête sont ignorés.
- Vous pouvez éventuellement commencer des lignes avec
export
et un seul espace (pas un onglet, allez comprendre).
- Après cela, chaque ligne doit avoir la forme
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.
- Si VALUE commence par
'
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.
- S'il n'y en a pas
=
, 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:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
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 changer
Quand 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:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
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
:
emulate sh -c '. ~/.profile'
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
ou sshd
. Ainsi , vous pouvez commencer votre ~/.bashrc
avec
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh 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
, comme MY_ENVIRONMENT_HAS_BEEN_SET=yes
, et vérifiez cette garde avant de lire ~/.profile
.
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
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 .