TL; DR
Эти файлы конфигурации, будь то глобальные ( /etc/environment
, /etc/profile
) или пользовательские ( ~/.profile
, ~/.bashrc
), обрабатываются только при следующем входе в систему / сеансе.
В глобальных файлах применяются ко всем пользователям ( а не только корень) ... но вы должны перезапустить сеанс регистрации , чтобы увидеть изменения , отраженные в окружающей среде. Это может произойти, позвонив, su
как вы заметили ... или выйдя из системы, перезагрузившись. Вы можете su
обратиться к некорневому пользователю, и вы увидите, что у него также есть изменения среды.
Причина, по которой вам нужно перезагрузиться или войти снова, чтобы получить глобальную среду, заключается в том, что среда наследуется от родительских процессов, а корневой процесс для всего остального, что вы запускаете, - это ваша оболочка входа в систему ... так что если ваша оболочка входа не имеет среда ... тогда и процессы не запускаются в оболочке входа в систему. Конечно, вы можете устанавливать / обновлять среду для отдельных процессов при их запуске, но вам нужно будет настроить среду для оболочки входа в систему и перезапустить все подпроцессы, чтобы они увидели изменения.
Глобальная среда
Как кто-то еще упомянул, вам нужно перезагрузиться или выйти из системы / войти в систему, чтобы изменения были внесены /etc/profile
, /etc/profile.d/*.sh
и их /etc/environment
нужно будет забрать.
Это потому, что хотя эти файлы определяют глобальную среду ... они запускаются только один раз при входе в систему, и поэтому существующие входы / сеансы не будут отражать изменения в этих файлах. Перезагрузка «сбрасывает» логин каждого пользователя, заставляя его выбрать новую среду.
В вашем собственном сеансе входа в систему вы можете source /etc/profile
получить изменения без перезагрузки или выхода из системы / входа в систему ... но это повлияет только на ваш собственный сеанс и новые процессы, выполняющиеся в вашем сеансе.
Также обратите внимание, что в переменной нет интерполяции /etc/environment
(это не скрипт), поэтому вы не можете делать такие вещи, как PATH="$PATH:/my/custom/path"
там.
Отмечу также , что /etc/profile
и /etc/profile.d/*.sh
запускается только для сеансов входа и поэтому среда настроена не будет доступна система без входа в системе счетов (то есть , если вы пытаетесь установить переменные окружения для процесса демона , который работает за пределами вашей оболочки).
Обратите внимание, что bashrc
это не полезно для установки среды для всей оболочки входа в систему, но для оболочек bash и подпроцессов ... поэтому для истинных "глобальных" или "глобальных пользователей" вы, вероятно, захотите поместить конфигурацию своей среды в /etc/profile
или /etc/profile.d/my-custom-env.sh
или ~/.profile
. Другие оболочки (например, zsh) также имеют свои собственные файлы конфигурации, поэтому конфигурация среды, не относящейся к bash, в bashrc вызовет проблемы или путаницу, если / когда вы переключите оболочки (или если другие пользователи в системе будут использовать другие оболочки).
Распространенной проблемой является установка новой программы, и для ее правильной работы необходимо указать некоторую среду. Глобальная среда - это один из ответов, но часто требуется перезагрузка, которая не идеальна для серверов и случаев автоматического обеспечения / настройки. Вы должны спросить себя, действительно ли это переменная, которая нужна всем пользователям и программам в системе, или это действительно просто то, что вам нужно сделать доступным для конкретного пользователя или программы.
Для конкретного пользователя
Посмотрите на включение среды в профиле или bashrc в домашнем каталоге пользователя (например ~/.profile
~/.bashrc
), в зависимости от того, хотите ли вы это для интерактивных, оболочек входа в систему, только для bash и т. д.
Имейте в виду, что это также требует перезагрузки или выхода из системы / входа в систему, чтобы изменения среды были доступны для всех процессов в сеансе входа пользователя в систему. Пользователь может source ~/.profile
... но это делается в терминале и обновляет только среду в этом терминальном сеансе и дочерних процессах ... не обязательно для всей среды входа пользователя в систему.
Для конкретной программы есть пара вариантов.
Одним из них является просто предоставить среду при запуске команды:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
Если вы используете Systemd вы можете также указать среду , в файле блок / услуг в соответствии [Service]
сEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
Эта опция может показаться неуклюжей, потому что вы должны указывать среду каждый раз, когда запускаете программу, но если среда действительно нужна только этой программе ... это действительно лучший способ, и вы должны к этому привыкнуть, а не выкидывать все в bashrc или файл профиля.
Если вы не используете systemd или init для настройки среды и запуска программы ... тогда, конечно, вы также можете просто обернуть выполнение программы скриптом bash, где вы сохраните полную команду, включая настройку среды, для удобства.
Ссылки:
Здесь также есть очень подробный ответ, который я предлагаю вам прочитать: /ubuntu//a/247769/824160
Добавление переменной
/etc/environment
для меня сработало.Однако мне пришлось перезагрузиться после изменения,
/etc/environment
чтобы изменения вступили в силу. Простого закрытия и повторного открытия окна терминала было недостаточно.источник
source /etc/environment
чтобы перезагрузить его.