在哪里声明环境变量?

在哪里声明环境变量?

哪些位置是正确的:

  1. 全局环境变量是否会影响所有用户?
  2. 用户特定的环境变量?

答案1

为了补充 sagarchalise 的回答,我可以总结一下链接所建议的适合设置的地方。

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

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

从页面:

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

使用/etc/profile是一种非常 Unix 式的方法,但在 Ubuntu 下其功能大大减弱。它的存在只是为了指向/etc/bash.bashrc并收集来自 的条目/etc/profile.d

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

对于本地或每个用户的设置

Ubuntu 页面推荐~/.pam_environment,由PAM 系统当您的会话启动时(TTY、GUI、SSH 等)。它相当于用户/etc/environment,使用相同的语法。如果不起作用,链接会建议替代方案:

  • ~/.profile对于大多数 shell 来说。显示管理器也可以将此文件应用于您的 GUI 会话,但对于所有显示管理器或显示服务器(X11 与 Wayland)或会话,情况不一定如此。

特定于 bash 的:

  • ~/.bash_profile~./bash_login- 如果其中一个存在,则 bash 将执行它,而不是~/.profile在 bash 作为登录 shell 启动时执行。Bash 将更喜欢~/.bash_profile~/.bash_login[...] 默认情况下,这些文件不会影响图形会话。"
  • ~/.bashrc—“...可能是设置变量最容易的地方”。

答案2

我认为社区 wiki 页面上的环境变量将帮助你理清

答案3

你有:

/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,我甚至不会尝试理解这一点

答案4

根据建议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 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

相关内容