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_environmentest 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_environmentest 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 somecommandet ssh somecommand.
La principale limitation ~/.pam_environmentest 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
exportet un seul espace (pas un onglet, allez comprendre).
- Après cela, chaque ligne doit avoir la forme
VAR=VALUEoù 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_environmentfonctionne 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/shcomme 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 ~/.profilepas 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_loginou ~/.bash_profiles'ils existent à la place de ~/.profile. Bash ne lit pas non plus ~/.bashrcdans un shell de connexion même s'il est interactif. Pour ne plus jamais avoir à vous souvenir de ces bizarreries, créez un ~/.bash_profileavec 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 ~/.zprofileet ~/.zlogin, mais pas ~/.profile. Zsh a une syntaxe différente de sh, mais peut lire ~/.profileen 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/shcomme 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 ENVvariable, si vous parvenez à le transmettre.
Bash lit ~/.bashrcs'il n'est pas interactif (!) Et son processus parent est appelé rshdou sshd. Ainsi , vous pouvez commencer votre ~/.bashrcavec
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh lit toujours ~/.zshenvquand 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 ~/.profilene 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 à ~/.profilenouveau source .