Где объявить переменные среды?


59

Каковы правильные места для:

  1. Глобальные переменные среды должны влиять на всех пользователей?
  2. Пользовательские переменные среды?

Ответы:


16

Я думаю, что вики-страница сообщества по переменным среды поможет вам разобраться


2
Проблема в том, что связанный документ запутан и / или явно неверен в части пользовательских переменных. Я все еще пытаюсь найти способ сделать это без использования оболочки. $ HOME / .profile, вероятно, лучшая ставка ...
— Rmano

16
Пожалуйста, вставьте текст или сделайте снимок связанного контента - он может быть недоступен в будущем!
— Nam G VU

4
Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
— Томас Уорд

75

Чтобы добавить ответ sagarchalise, я могу суммировать, что ссылка предлагает в качестве подходящих мест для настроек.

Для глобальных настроек, общесистемных переменных среды

  • использование /etc/environment
  • Не используйте /etc/profileили/etc/bash.bashrc

Со страницы:

/etc/environment[...] специально предназначено для общесистемных настроек переменных среды. Это не файл сценария, а скорее состоит из выражений присваивания, по одному на строку. В частности, этот файл хранит общесистемные настройки языка и пути.

Использование /etc/profile- это очень Unix-й способ, но его функциональность значительно снижена в Ubuntu. Он существует только для указания /etc/bash.bashrcи сбора записей /etc/profile.d.

В моей системе единственная интересная запись в файле profile.d - это /etc/profile.d/bash_completion.sh.

Для локальных или индивидуальных настроек

Рекомендована предыдущая версия страницы Ubuntu ~/.pam_environment, но в настоящее время страница предлагает, чтобы, если это не сработало, вы должны использовать

  • ~/.profile - Это, вероятно, лучший файл для размещения назначений переменных среды, поскольку он выполняется автоматически DisplayManager во время сеанса рабочего стола процесса запуска, а также оболочкой входа в систему при входе из текстовой консоли.

  • ~/.bash_profileили ~./bash_login- если один из них существует, bash выполняет его вместо ~/.profileзапуска bash в качестве оболочки входа в систему. Bash предпочтет ~/.bash_profileв ~/.bash_login. [...] Эти файлы не влияют на графическую сессию по умолчанию. "

  • ~/.bashrc - "... может быть проще всего установить переменные".

1
Какие программы читать /etc/environmentи когда? Похоже, что он не работает с Cron, даже при использованииSHELL=/bin/bash
— SystemParadox

1
Похоже, что / etc / environment является частью PAM, что означает, что он должен устанавливать среду по умолчанию для всех процессов. Cron является особенным (то есть неработающим) тем, что специально перезаписывает эту среду своей собственной.
— SystemParadox

так как ведет себя .bashrc? после bash_profile? вместо .profile?
— открывается

1
@opensas Вы, вероятно, должны задать отдельный вопрос, ссылаясь на этот или ответ.
— belacqua

@belacqua позволяет сказать , что мне нужно добавить 2 или более переменных среды /etc/environmentнравится JAVA_HOME="/opt/java" и ANT_HOME="/opt/ant" как это сделать
— Kasun Siyambalapitiya

7

У тебя есть:

/ etc / profile: общесистемный файл .profile для оболочки Bourne (sh (1)) и совместимых с Bourne оболочек (bash (1), ksh (1), ash (1), ...).

который в Lucid и Maverick работает

/etc/profile.d/*.sh

если присутствует, и если оболочка пользователя bash:

/etc/bash.bashrc

Для пользовательской среды существует запутанный массив, специфичный для оболочки, и считается ли он «оболочкой входа в систему». Если оболочка bash:

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

для ш / тире:

$HOME/.profile

для zsh я даже не собираюсь пытаться понять это .


5

Как рекомендовано на https://help.ubuntu.com/community/EnvironmentVariables :

  1. Глобальные переменные среды должны влиять на всех пользователей /etc/environment.

  2. Пользовательские переменные среды должны быть установлены в ~/.pam_environment.

Избегайте профилей и файлов rc для установки переменных среды в Ubuntu. Они вызвали у меня больше головных болей, чем они того стоят.

Это легче сказать, чем сделать, однако;)

Возможно, вы столкнетесь с тем же разрывом в конфигурации, который существовал для меня. Смотрите обходной путь для зашифрованного дома ниже.

Мой ~/.pam_environment:

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

Почему уродливый статический путь? ${PATH}не будет работать для меня. Я несколько раз пытался обойти свой логин, пытаясь обойти его, поэтому я придерживался уродливой статической копии значений по умолчанию :)

Обходной путь для зашифрованных домашних папок

В выпусках Ubuntu вплоть до Precise 12.04 Beta 2 включительно, если вы используете зашифрованный домашний каталог, вам нужно будет изменить /etc/pam.d/common-sessionего, чтобы загрузить ~/.pam_environment. Это решение, очевидно, работает для более ранних выпусков, но я не проверял его.

Гюнтер Монтег (g-montag) написал 2010-08-19:

Это кажется проблемой с зашифрованными домашними каталогами. я добавил

требуется сеанс pam_env.so

в конце /etc/pam.d/common-session и теперь ~ / .pam_environment читается. В другой системе без зашифрованных домашних каталогов (также 10.04) обходной путь не требуется. Возможно, в моем случае система пытается прочитать ~ / .pam_environment, прежде чем она расшифрована.

Адаптировано из моего ответа на Супер пользователя: https://superuser.com/a/408373/66856


Это все еще неправильно: ${HOME}тоже не сработает. Там нет расширения в .pam_environment.
— detly

2
@ детально есть расширение .pam_environment, но HOMEобычно не так рано. Если бы эта строка прочитала DEFAULT=${PATH}/Applications/jdk, вы бы увидели значение PATHвставленной в нее.
— Муру
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.