如何在我的Linux系统下为每个人设置环境变量?

问题描述 投票:0回答:7

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

linux bash unix environment-variables
7个回答
142
投票

除了其他人提到的

/etc/profile
之外,一些 Linux 系统现在使用目录
/etc/profile.d/
;其中的任何
.sh
文件都将由
/etc/profile
获取。将自定义环境内容保存在这些文件中比仅编辑
/etc/profile
稍微整洁一些。


133
投票

如果您的 Linux 操作系统有此文件:

/etc/environment

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

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


43
投票

人8 pam_env

man 5 pam_env.conf

如果所有登录服务都使用 PAM,并且所有登录服务在各自的

session required pam_env.so
配置文件中都有
/etc/pam.d/*
,那么所有登录会话都将具有一些在
pam_env
的配置文件中指定的环境变量。

在大多数现代 Linux 发行版上,默认情况下都是如此 - 只需将所需的全局环境变量添加到

/etc/security/pam_env.conf

无论用户的 shell 是什么,这都有效,并且也适用于图形登录(如果 xdm/kdm/gdm/entrance/... 是这样设置的)。


19
投票

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

如果你把它放在

/etc/profile
中,这将为大多数 posix 兼容的 shell 用户解决问题。对于非关键目的来说,这可能“足够好”。

但是任何拥有

csh
tcsh
shell 的人都看不到它,而且我不相信
csh
有全局初始化文件。


15
投票

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

当 bash 作为交互调用时 登录 shell,或作为非交互式 shell 带有

--login
选项,它 首先读取并执行命令 文件
/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

6
投票

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

由于每个进程的环境都是受到保护的,所以没有办法给每个正在运行的进程“注入”环境变量,所以即使你修改了默认的 shell .rc/profile,也只有在每个进程退出后才会生效。重新加载其启动设置。

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

Unix 的设计宗旨是在一定限度内服从用户。

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

avoiding bashisms


5
投票

使用 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
© www.soinside.com 2019 - 2024. All rights reserved.