it-swarm.cn

在哪里声明环境变量?

什么是正确的地方:

  1. 全球环境变量意味着影响所有用户?
  2. 用户特定的环境变量?
59
Ivan

我认为 关于环境变量的社区维基页面 会帮助你理清

16
sagarchalise

为了增加sagarchalise的答案,我可以总结链接建议的适当的设置位置。

对于全局设置,系统范围的环境变量

  • 使用/etc/environment
  • 不要使用/etc/profile/etc/bash.bashrc

从页面:

/etc/environment [...]专门用于系统范围的环境变量设置。它不是一个脚本文件,而是由赋值表达式组成,每行一个。具体来说,此文件存储系统范围的区域设置和路径设置。

使用/etc/profile是一种非常方便的方法,但在Ubuntu下它的功能大大减少了。它仅存在于指向/etc/bash.bashrc并从/etc/profile.d收集条目。

在我的系统上,profile.d中唯一有趣的条目是/etc/profile.d/bash_completion.sh

对于本地或每用户设置

以前版本的Ubuntu页面推荐了~/.pam_environment,但是当前页面建议如果这不起作用,你应该使用

  • ~/.profile - 这可能是放置环境变量赋值的最佳文件,因为它在启动过程桌面会话期间由DisplayManager自动执行,并且当从文本控制台登录时由登录Shell执行。

  • ~/.bash_profile~./bash_login - 如果存在其中一个,当bash作为登录Shell启动时,bash会执行它而不是~/.profile。 Bash会更喜欢~/.bash_profile~/.bash_login。 [...]默认情况下,这些文件不会影响图形会话。“

  • ~/.bashrc - “......可能是设置变量的最简单的地方”。
75
belacqua

你有:

/ etc/profile:Bourne Shell(sh(1))和Bourne兼容shell(bash(1),ksh(1),ash(1),...)的系统范围.profile文件。

在Lucid和Maverick中

/etc/profile.d/*.sh

如果存在,如果用户的Shell是bash:

/etc/bash.bashrc

对于用户环境,有一个特定于Shell的令人困惑的数组,以及它是否被视为“登录Shell”。如果Shell是bash:

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

对于sh/dash:

$HOME/.profile

对于zsh,我甚至不会尝试 理解这一点

7
msw

按照 https://help.ubuntu.com/community/EnvironmentVariables 的建议:

  1. 旨在影响所有用户的全局环境变量应该放在/etc/environment中。

  2. 应在~/.pam_environment中设置特定于用户的环境变量。

避免使用profile和rc文件在Ubuntu上设置环境变量。他们让我比头脑更值得头疼。

说起来容易做起来难,但是;)

您可能遇到与我相同的配置差距。请参阅下面的加密主页的解决方法。

我的~/.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

为什么丑陋的静态路径? ${PATH}对我不起作用。我多次尝试解决登录问题,因此我坚持使用默认的丑陋静态副本:)

加密的主文件夹的解决方法

在Ubuntu版本中包括Precise 12.04 Beta 2,如果您使用的是加密的主目录,则需要修改/etc/pam.d/common-session以使其加载~/.pam_environment。这个解决方案显然适用于早期版本,但我还没有测试过。

Guenther Montag(g-montag)写于2010-08-19:

这似乎是加密主目录的问题。我补充道

会话需要pam_env.so

在/etc/pam.d/common-session结束时,现在〜/ .pam_environment被读取。在没有加密主目录(也是10.04)的另一个系统上,不需要解决方法。也许在我的情况下,系统在解密之前尝试读取〜/ .pam_environment。

改编自我对超级用户的回答: https://superuser.com/a/408373/66856

5
Alain O'Dea