Я пытаюсь настроить сервер Linux под управлением CentOS 7 для нескольких пользователей. После установки 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
custom.sh
# 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 в этом файле.)
Я создавал сотни centos 7 за последние 6 месяцев, немного подправлял их и никогда не видел, что вы описываете. Как сказал Томас, по умолчанию /root/.bashrc не вызывает / исходные скрипты в /etc/profile.d.
РЕДАКТИРОВАТЬ : Фактически, /root/.bashrc ИМЕЕТ источник /etc/prodile.d/* с помощью / etc / bashrc и предотвращает эхо:
# 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 / Думаю, это действительно не ошибка (какой ISO вы получили для своего centos 7? Вы суммировали его md5? Задавать этот вопрос мне кажется странным)
2 /, а обходного пути нет, но удалить код, который заставляет скрипты загружаться дважды?
/etc/profiles.d кажется правильным местом для размещения некоторых скриптов, если они "молчаливы", то есть определяют некоторые переменные среды, но не создают эхо или вызывают какой-то динамический motd, иначе в какой-то момент он будет взаимодействовать некорректно, с другими скриптами, которые вы будете запускать (в последнее время получил опыт установки netdata).
Некоторые интересные моменты читать на unix.stackexchange.