【问题标题】:How to set environment variable for everyone under my linux system?如何为我的linux系统下的每个人设置环境变量?
【发布时间】:2010-12-11 02:52:21
【问题描述】:

我可以为我的所有用户设置通用的某些设置吗?

【问题讨论】:

  • 是出口吗?附加它并且它是全局的?
  • 我认为它只是附加在当前会话中,当您在终端中打开新会话时它会消失
  • 是的,导出仅适用于当前会话,但将变量添加到 /etc/environment 文件时效果不佳。这很奇怪我唯一的环境变量是PATH,但它的内容与我通过env列出所有变量时看到的PATH不同
  • 我错过了运行source /etc/environment

标签: linux unix bash


【解决方案1】:

除了其他人提到的/etc/profile,一些Linux系统现在使用目录/etc/profile.d/;那里的任何.sh 文件都将来自/etc/profile。将您的自定义环境内容保存在这些文件中比仅编辑 /etc/profile 稍微简洁一些。

【讨论】:

  • 如果某些用户使用其他 shell,比如 zsh 怎么办?
  • 这不是全球性的......它仅限于外壳......太糟糕了,它是最被接受的答案
  • zsh 会在 /etc/profile.d/ 中获取 .sh 文件,你可以从 /etc/zshrc @Matthieu Napoli 看到它
  • ROOT 用户不使用脚本。
  • @Bily,这并不适用于所有系统。例如,在我的 Ubuntu 21.04 上没有 /etc/zshrc 并且 /etc/zsh/zshrc 的全局配置没有从 /etc/profile.d/ 获取内容
【解决方案2】:

如果你的 Linux 操作系统有这个文件:

/etc/environment

您可以使用它为所有用户永久设置环境变量。

摘自:http://www.sysadmit.com/2016/04/linux-variables-de-entorno-permanentes.html

【讨论】:

  • 在 Kubuntu 上也适用于我
【解决方案3】:

man 8 pam_env

man 5 pam_env.conf

如果所有登录服务都使用PAM,并且所有登录服务在它们各自的/etc/pam.d/* 配置文件中都有session required pam_env.so,那么所有登录会话都会有一些在pam_env 的配置文件中指定的环境变量。

在大多数现代 Linux 发行版上,默认情况下这些都存在 - 只需将所需的全局环境变量添加到 /etc/security/pam_env.conf

无论用户的外壳如何,这都适用,并且也适用于图形登录(如果 xdm/kdm/gdm/entrance/... 设置为这样)。

【讨论】:

  • +1 在 pam_env.conf 中添加变量后,您还需要重新启动,因为 $ echo $variablename 不显示
  • 不需要重启,需要重新登录。 (我不需要重启关键服务器)
  • 这似乎不适用于我的发行版 Mint 17.2。预安装的文件被完全注释掉,如果我添加 echo foo>/home/me/bar 之类的内容并重新启动(并再次登录),则不会创建该文件。 (可能有一种更优雅的方法来测试它,但我想在此处发表评论之前确定一下。)
【解决方案4】:

令人惊讶的是,Unix 和 Linux 实际上并没有设置全局环境变量的地方。您能做的最好的事情就是安排任何特定的 shell 进行特定于站点的初始化。

如果你把它放在/etc/profile 中,这将为大多数兼容 posix 的 shell 用户提供帮助。对于非关键目的,这可能“足够好”了。

但是任何拥有cshtcsh shell 的人都不会看到它,而且我不相信csh 有一个全局初始化文件。

【讨论】:

  • /etc/environment 实际上似乎为我设置了环境变量,即使作为 root 用户也是如此。我知道/etc/environment 在amazon linux 和ubuntu 上。我没有检查是否适用于 csh、tcsh 或 zsh。
  • 它不是特定于您使用的 shell,它是真正的全局
【解决方案5】:

bash 手册页的一些有趣的摘录:

当 bash 作为交互式调用时 登录外壳,或作为非交互式 带有--login 选项的shell,它 首先从 文件/etc/profile,如果该文件 存在。读取该文件后,它 寻找~/.bash_profile~/.bash_login~/.profile,在那 命令,并读取和执行命令 从第一个存在并且是 可读。 --noprofile 选项可能 在 shell 启动时使用 禁止这种行为。
...
当一个 不是登录的交互式 shell shell 启动,bash 读取并 执行命令 /etc/bash.bashrc~/.bashrc,如果 这些文件存在。这可能是 使用--norc 选项禁止。 --rcfile 文件选项将强制 bash 读取和执行命令 文件而不是 /etc/bash.bashrc~/.bashrc.

所以看看/etc/profile/etc/bash.bashrc,这些文件是全局设置的正确位置。将类似这样的内容放入其中以设置环境变量:

export MY_VAR=xxx

【讨论】:

  • 请注意,在经典的 Unix 系统上,Bourne shell 和 Korn shell 也都读取 /etc/profile - 它可能是系统环境设置最广泛使用的位置。某些版本的 C shell 查看 /etc/csh.cshrc 和 /etc/csh.login 以及每个用户的位置;其他的不使用任何系统环境设置文件。
  • 太棒了,就为非登录 shell 用户设置环境而言,这正是我所寻找的。​​span>
  • 对不起,我似乎不小心在一段时间内看不到箭头时对此投了反对票……您介意编辑一下吗(例如,倒数第二行中的错字“environEment”)所以我可以删除反对票?
【解决方案6】:

在 Linux 内核下运行的每个进程都会收到它自己的、独特的环境,该环境是从其父进程继承而来的。在这种情况下,父级将是 shell 本身(生成子 shell)或“登录”程序(在典型系统上)。

由于每个进程的环境都受到保护,因此无法为每个正在运行的进程“注入”一个环境变量,因此即使修改了默认的 shell .rc / 配置文件,它也不会在每个进程之前生效退出并重新加载其启动设置。

查看 /etc/ 以修改任何特定 shell 的默认启动变量。只要意识到用户可以(并且经常)在他们的个人设置中更改它们。

Unix 被设计成在一定范围内服从用户。

NB:Bash 不是您系统上的唯一 shell。请注意 /bin/sh 符号链接实际指向的内容。在许多系统上,这实际上可能是 dash (默认情况下,没有特殊调用)POSIXLY 正确。因此,您应该注意修改 both 默认值,否则以 /bin/sh 开头的脚本将不会继承您的全局默认值。同样,请注意避免在编辑两者时只有 bash 才能理解的语法,即 avoiding bashisms

【讨论】:

    【解决方案7】:

    使用 PAM 非常棒。

    # modify the display PAM
    $ cat /etc/security/pam_env.conf 
    # BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
    # AFTER : $ python $abc/click.py &
    DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
    abc   DEFAULT=/var/tmp/myproject
    

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2017-07-02
      • 1970-01-01
      • 2015-09-16
      • 2013-11-11
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多