在哪里声明环境变量?


Answers:


16

我认为有关环境变量的社区Wiki页面将帮助您进行分类


2
问题在于,链接的文档在用户指定的变量中被混淆和/或完全错误。我仍在尝试寻找一种与外壳无关的方法。$ HOME / .profile可能是最好的选择……
Rmano 2012年

16
请粘贴文本或对链接内容进行快照-将来可能不可用!
Nam G VU 2014年

4
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
托马斯·沃德

75

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

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

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

从页面:

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

使用/etc/profile是非常Unix-y的方式,但是在Ubuntu下其功能大大降低了。它仅存在于指向/etc/bash.bashrc并从中收集条目/etc/profile.d

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

对于本地或每用户设置

建议使用Ubuntu页面的早期版本~/.pam_environment,但该页面当前建议如果该页面不起作用,则应使用

  • ~/.profile -这可能是放置环境变量分配的最佳文件,因为在启动过程桌面会话期间,DisplayManager会自动执行该文件,而从文本控制台登录时,它会由登录外壳程序自动执行。

  • ~/.bash_profile~./bash_login-如果存在其中之一,则bash会执行该命令,而不是将~/.profilebash作为登录shell启动时执行。bash将喜欢~/.bash_profile~/.bash_login。[...]默认情况下,这些文件不会影响图形会话。”

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

1
哪些程序/etc/environment在何时阅读?它似乎不适用于cron,即使使用SHELL=/bin/bash
SystemParadox 2013年

1
看来/ etc / environment是PAM的一部分,这意味着它应该为所有进程设置默认环境。cron的特殊之处在于它自己覆盖了这个环境。
SystemParadox

那么.bashrc的行为如何?在bash_profile之后?而不是.profile?
13年

1
@opensas您可能应该作为一个单独的问题提出问题,请参考此问题或答案。
belacqua

@belacqua可以说我需要添加2个或更多的环境变量才能/etc/environment喜欢JAVA_HOME="/opt/java" ANT_HOME="/opt/ant" 怎么做
Kasun Siyambalapitiya

7

你有:

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

在Lucid和Maverick中运行

/etc/profile.d/*.sh

如果存在,并且用户的外壳为bash:

/etc/bash.bashrc

对于用户环境,存在一个特定于外壳的混乱数组,以及是否将其视为“登录外壳”。如果外壳是bash:

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

对于sh / dash:

$HOME/.profile

对于zsh,我什至不打算尝试理解这一点


5

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

  1. 应当影响所有用户的全局环境变量/etc/environment

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

避免使用配置文件和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


这仍然是错误的:${HOME}也不起作用。中没有扩展.pam_environment
2014年

2
@detly中有扩展.pam_environment,但HOME通常不会这么早设置。如果该行显示为DEFAULT=${PATH}/Applications/jdk,则您已经看到了其中PATH插入的值。
大师
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.