在哪里声明环境变量?

Iva*_*van 63 command-line environment-variables

什么是正确的地方:

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

bel*_*qua 82

为了补充 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,它在您的会话启动时由PAM 系统加载(TTY、GUI、SSH 等)。它是用户等效项/etc/environment并使用相同的语法。如果这不起作用,该链接建议了替代方案:

  • ~/.profile对于大多数贝壳。该文件也可以通过显示管理器应用于您的 GUI 会话,但不必适用于所有显示管理器或显示服务器(X11 与 Wayland)或会话。

和 bash 特定的:

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


sag*_*ise 17

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

  • 请粘贴文本或拍摄链接内容的快照 - 将来可能无法使用! (18认同)
  • 虽然这在理论上可以回答这个问题,但 [最好](​​http://meta.stackoverflow.com/q/8259) 在此处包含答案的基本部分,并提供链接以供参考。 (6认同)
  • 问题是链接文档在用户特定变量部分混淆和/或完全错误。我仍然试图找到一种与 shell 无关的方法来做到这一点。$HOME/.profile 可能是最好的选择... (2认同)

msw*_*msw 7

你有:

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

在 Lucid 和 Maverick 中运行

/etc/profile.d/*.sh
Run Code Online (Sandbox Code Playgroud)

如果存在,并且用户的 shell 是 bash:

/etc/bash.bashrc
Run Code Online (Sandbox Code Playgroud)

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

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file
Run Code Online (Sandbox Code Playgroud)

对于 sh/破折号:

$HOME/.profile
Run Code Online (Sandbox Code Playgroud)

对于 zsh,我什至不会试图理解这一点


Ala*_*Dea 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
Run Code Online (Sandbox Code Playgroud)

为什么是丑陋的静态路径?${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

  • @detly 在`.pam_environment` 中有扩展,但通常不会那么早设置`HOME`。如果该行读取了`DEFAULT=${PATH}/Applications/jdk`,您就会看到其中插入了`PATH` 的值。 (2认同)