背景信息:
我正在尝试为多个用户配置运行 CentOS 7 的 Linux 服务器。安装 java 后,我想$JAVA_HOME
为所有用户全局设置环境变量并将其添加到$PATH
。
为此,我查看了/etc/profile
启动时调用的脚本。我遵循了脚本顶部的建议:
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
我创建了自己的/etc/profile.d/custom.sh
脚本来配置 Java 环境
自定义文件
# Java configuration
export JAVA_HOME=/usr/lib/jvm/java
export PATH=${JAVA_HOME}/bin:${PATH}
问题:
每当我登录时,该/etc/profiles.d/custom.sh
脚本(以及我输入的任何其他脚本/etc/profiles.d
)都会被调用两次并添加$JAVA_HOME
到$PATH
两次。
我意识到这似乎是因为所有的脚本/etc/profiles.d
都是从两者调用的/etc/profile
和 /etc/bashrc
。
# This is in both /etc/profile and /etc/bashrc
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
这似乎确实不正确,但我做了一些挖掘,结果发现这似乎就是事实......
问题:
这是 CentOS 7 操作系统的一个错误吗?
是否有一个好的解决方法可以用来创建全局环境设置而无需设置两次?(我不想设置它们,
/etc/environment
因为我不能在该文件中使用 bash 变量。)
答案1
过去 6 个月,我已生成了数百个 centos 7,并以某种方式对其进行了调整,但我从未见过您所描述的情况。正如 Thomas 所说,默认情况下,/root/.bashrc 不会调用 /etc/profile.d 中的 /source 脚本。
编辑 : 实际上,/root/.bashrc 确实通过 /etc/bashrc 来获取 /etc/prodile.d/*,并阻止回声:
# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
猜猜我最近遇到的问题有什么不同,我不得不快速解决它们,但挖掘不够。抱歉。
旧答案
1/ 我猜这真的不是一个错误(你为你的 centos 7 获取了什么 ISO?你对它进行过 md5sum 吗?问这个问题对我来说听起来实际上很奇怪)
2 / 然后没有解决方法,但是删除使脚本两次来源的代码?
如果它们是“静默的”,那么 /etc/profiles.d 似乎是放置某些脚本的正确位置,这意味着定义一些环境变量但不产生回声或调用某些动态 motd,否则它会在某些时候以某些不好的方式与您将运行的其他脚本进行交互(最近获得了使用 netdata install 的经验)。
一些有趣的观点在 unix.stackexchange 上阅读。