Установка глобальной переменной среды для всех

17

Если я установлю переменную в /etc/environment, это, кажется, применяется только к администраторам, когда в sudo su.

Как я могу заставить переменные применяться ко всем? Особенно когда они в терминале? Настройки /etc/enviromentне относятся к bash?

Mick.D
источник

Ответы:

13

/etc/environmentОбновление будет работать только на следующей сессии, она автоматически не перезагружается.

Это означает, что вы не можете изменить его для сеансов, которые уже начались для других пользователей.

Если вы хотите «перезагрузить» все, что находится в, /etc/environmentвам нужна следующая команда:

source /etc/environment

Но опять же, это будет работать только для вашего текущего сеанса, другие пользователи не будут затронуты, пока они не начнут новый сеанс или не выполнят вышеуказанную команду в своем собственном сеансе.

Panthro
источник
4

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

mattpr
источник
3

создать собственный сценарий оболочки под

/etc/profile.d/

добавьте свои глобальные переменные среды в созданный скрипт, перезагрузите компьютер, и тогда он будет доступен всем

shalamus
источник
Я считаю, что это более надежный подход, чем редактирование файла / etc / environment, так как этот файл может быть изменен при обновлении пакетов.
Фрид
2

Добавление переменной /etc/environmentдля меня сработало.

Однако мне пришлось перезагрузиться после изменения, /etc/environmentчтобы изменения вступили в силу. Простого закрытия и повторного открытия окна терминала было недостаточно.

крис
источник
3
Вы всегда можете сделать это, source /etc/environmentчтобы перезагрузить его.
Panthro
Выход из системы и обратно должен быть достаточным.
Каруханга