Quels fichiers de configuration doivent être utilisés pour configurer les variables d'environnement avec bash?

9

Comme je l'ai demandé et obtenu des réponses ici et ici , la variable PATH a des noms de chemin différents selon la façon dont l'application est activée.

  • Quels fichiers de configuration (.bashrc, .profile, ...) doivent être utilisés pour avoir la même variable PATH, peu importe comment je démarre le logiciel avec bash?
prosseek
la source

Réponses:

15

Traditionnellement, l'endroit pour définir des variables d'environnement par utilisateur sur les systèmes Unix est ~/.profile. Ce fichier est lu par le shell de connexion (c'est-à-dire le programme démarré lorsque vous vous connectez et dans lequel vous pouvez taper des commandes), à condition que le shell de connexion soit un shell compatible Bourne.

Bash est un shell compatible Bourne. Lorsqu'il est invoqué en tant que shell de connexion, il lit ~/.bash_profilesi ce fichier existe et ~/.profiles'il ~/.bash_profilen'existe pas.

En règle générale, si vous tapez votre mot de passe en mode texte (par exemple, sur une console texte ou à distance avec ssh), le shell que vous obtenez est un shell de connexion.

Cependant, si vous tapez votre mot de passe dans un programme graphique et que vous vous connectez à un environnement graphique, cela contourne le shell de connexion normal. La .profilelecture dans ce cas dépend de la configuration de la session graphique; par exemple, il varie entre les distributions Linux, entre les gestionnaires d'affichage et entre les environnements de bureau. Parfois, l'un des programmes de la chaîne appelle explicitement un shell de connexion; parfois l'un des programmes lit explicitement ~/.profile; et parfois rien de tout cela ne se produit et ~/.profilen'est pas lu.

Pour donner un exemple de la variabilité, pour autant que je sache d'un rapide coup d'œil aux scripts impliqués, sur Ubuntu 10.04: si vous vous connectez avec kdm ou lxdm, ~/.bash_profileest lu s'il existe, et ~/.profilesinon; si vous vous connectez avec gdm, seul ~/.profileest lu; si vous vous connectez avec xdm, ~/.profilen'est pas lu.

Tous les systèmes que je connais fournissent un moyen de définir des variables d'environnement par utilisateur. Malheureusement, il n'y a pas de réponse générale.

Notez que parfois vous verrez des recommandations pour définir des variables d'environnement dans ~/.bashrc, ou démarrer un shell de connexion dans chaque terminal dans un environnement GUI. Les deux sont de mauvaises idées; l'une des raisons est le problème que vous avez rencontré, à savoir que vos variables d'environnement n'étaient disponibles que dans les programmes démarrés via un terminal, et non dans les programmes démarrés directement avec une icône ou un menu ou un raccourci clavier.

Gilles 'SO- arrête d'être méchant'
la source
Certaines applications appellent des shells interactifs sans connexion, ce qui signifie que .profile et .bash_profile ne sont pas lus. Si vous voulez définir des vars env pour ces applications, une façon de le faire est de les définir dans .bashrc même si ce n'est pas censé être le lieu; voir github.com/mobile-shell/mosh/issues/102#issuecomment-12503646
William
@William .profileest lu lorsque vous vous connectez. La mise en place de variables d'environnement .bashrcne fonctionne pas, et votre scénario illustre cela: l'application (vraisemblablement GUI) qui exécute ce shell devrait avoir vos variables d'environnement, mais si vous les définissez dans .bashrc, cela ne fonctionne pas '' t.
Gilles 'SO- arrête d'être méchant'
mosh n'est pas une interface graphique, c'est une alternative à ssh. Je ne défends pas son comportement, j'essaie simplement d'aider ceux qui rencontrent le même problème que moi et d'autres, comme décrit dans le problème Github que j'ai lié.
William
2

La réponse définitive se trouve dans la section de la page de manuel bash sur Bash Startup Files . "Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, Bash lit et exécute les commandes de ~ / .bashrc, si ce fichier existe."

Les réponses à vos autres questions indiquent que eshell ne fonctionne pas réellement bash. Emacs eshellne l'est pas bash. En supposant que eshellcela se chargerait .bashrcest aussi défectueux que de supposer zshou cshse chargerait .bashrc. C'est une coquille différente.

Je vois deux options:

  1. Créez votre propre script qui prend une liste de répertoires et génère le code bash approprié bashet le code elisp pour eshell.
  2. Définissez votre variable d'environnement ESHELL ou SHELL afin que vous réellement n'exécutez bash au sein emacs. C'est ce que je fais. Bash fonctionne bien dans emacs.

Vous pourriez également être intéressé par la discussion sur l' ajout d'un répertoire à un chemin sans doublons .

Doug Harris
la source
1

La définition de votre PATH dans votre ~ / .profile devrait simplement fonctionner. Ce fichier est lu lors de la connexion par chaque shell compatible POSIX ou similaire à Bourne que je connais, y compris bash. Si vous apportez des modifications à ce fichier, vous devrez vous déconnecter et vous reconnecter pour que les modifications prennent effet. Puisque PATH fait partie de l'environnement de votre processus de connexion, il doit être exporté vers chaque shell que vous démarrez par la suite.

garyjohn
la source