我可以拥有对所有用户通用的某些设置吗?
除了其他人提到的
/etc/profile
之外,一些 Linux 系统现在使用目录 /etc/profile.d/
;其中的任何 .sh
文件都将由 /etc/profile
获取。将自定义环境内容保存在这些文件中比仅编辑/etc/profile
稍微整洁一些。
如果您的 Linux 操作系统有此文件:
/etc/environment
您可以使用它为所有用户永久设置环境变量。
摘自:http://www.sysadmit.com/2016/04/linux-variables-de-entorno-permanentes.html
如果所有登录服务都使用 PAM,并且所有登录服务在各自的
session required pam_env.so
配置文件中都有 /etc/pam.d/*
,那么所有登录会话都将具有一些在 pam_env
的配置文件中指定的环境变量。
在大多数现代 Linux 发行版上,默认情况下都是如此 - 只需将所需的全局环境变量添加到
/etc/security/pam_env.conf
。
无论用户的 shell 是什么,这都有效,并且也适用于图形登录(如果 xdm/kdm/gdm/entrance/... 是这样设置的)。
令人惊讶的是,Unix 和 Linux 实际上没有设置全局环境变量的地方。您能做的最好的事情就是安排任何特定的 shell 进行特定于站点的初始化。
如果你把它放在
/etc/profile
中,这将为大多数 posix 兼容的 shell 用户解决问题。对于非关键目的来说,这可能“足够好”。
但是任何拥有
csh
或 tcsh
shell 的人都看不到它,而且我不相信 csh
有全局初始化文件。
bash 手册页中的一些有趣摘录:
当 bash 作为交互调用时 登录 shell,或作为非交互式 shell 带有
选项,它 首先读取并执行命令 文件--login
,如果该文件 存在。读取该文件后, 寻找/etc/profile
,~/.bash_profile
和~/.bash_login
,在那 命令、读取和执行命令 从第一个存在且存在的 可读。~/.profile
选项可以 当 shell 启动时使用 抑制这种行为。--noprofile
...
当 非登录的交互式 shell shell 启动,bash 读取并 执行来自的命令和/etc/bash.bashrc
,如果 这些文件存在。这可能是 通过使用~/.bashrc
选项来抑制。--norc
文件选项将强制 bash 读取并执行命令 文件而不是--rcfile
和/etc/bash.bashrc
。~/.bashrc
所以看看
/etc/profile
或/etc/bash.bashrc
,这些文件是全局设置的正确位置。在其中放入类似的内容来设置环境变量:
export MY_VAR=xxx
Linux 内核下运行的每个进程都会收到从其父进程继承的自己独特的环境。在这种情况下,父级要么是 shell 本身(生成子 shell),要么是“登录”程序(在典型系统上)。
由于每个进程的环境都是受到保护的,所以没有办法给每个正在运行的进程“注入”环境变量,所以即使你修改了默认的 shell .rc/profile,也只有在每个进程退出后才会生效。重新加载其启动设置。
查看 /etc/ 以修改任何特定 shell 的默认启动变量。只需意识到用户可以(并且经常)在个人设置中更改它们。
Unix 的设计宗旨是在一定限度内服从用户。
NB:Bash 不是系统上唯一的 shell。请特别注意 /bin/sh 符号链接实际指向的内容。在许多系统上,这实际上可能是 dash,这是(默认情况下,没有特殊调用)POSIXLY 正确的。因此,您应该小心修改 both 默认值,否则以 /bin/sh 开头的脚本将不会继承您的全局默认值。同样,在编辑两者时请注意避免只有 bash 理解的语法,即
avoiding bashisms
。
使用 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