Этот ответ в основном касается порядок, в котором переменные среды, такие как PATH
назначаются если указано в разных файлах конфигурации. Я также описываю, где вы обычно должны их устанавливать, но в приведенном ниже списке файлы перечислены не в том порядке, в котором вам следует рассмотреть возможность их использования. Для получения общей информации о настройке PATH
и другие переменные среды в Ubuntu, я также рекомендую прочитать Переменные среды и другие ответы на этот вопрос.
Предпочтительное место для установки PATH
зависит от какие пользователи вам нужно установить его для и когда и как вы хотите, чтобы он был установлен. Частью вашего решения будет то, хотите ли вы, чтобы переменная среды была установлена для всех пользователей или для каждого пользователя. Если вы не уверены, то я рекомендую установить его только для одного пользователя (например, для вашей учетной записи), а не для всей системы.
Как Алексп говорит, в PATH
переменная среды будет иметь значение, которое она имела последний раз назначенный. На практике, наибольший от времени, которое вы установили PATH
, вы включаете в себя старый значение PATH
в новом значении, так что предыдущие записи сохраняются.
Таким образом, на практике, когда PATH
устанавливается из нескольких файлов, обычно содержит записи, указанные во всех файлах. Но это происходит только потому, что все файлы, которые его устанавливают, кроме первого, обычно ссылаются на PATH
сама переменная, в результате чего ее старое значение будет включено в новое.
Таким образом, вы фактически запрашиваете порядок, в котором PATH
настройки в различных файлах вступают в силу.
Общие места общего назначения для установки PATH
перечислены ниже в том порядке, в котором они вступают в силу при входе пользователя в систему, нет в том порядке, в котором вы обычно должны рассмотреть возможность их использования. Каждое из перечисленных ниже мест является разумным выбором для установки PATH
в некоторые ситуации, но лишь немногие из них являются хорошим выбором в большинстве случаев.
В приведенном ниже списке вы увидите некоторые имена каталогов, такие как ~/.profile
. На случай, если вы не знакомы с расширение тильды, ~/
ссылается на домашний каталог текущего пользователя. Я в основном использую этот синтаксис для компактности. Он поддерживается в сценариях оболочки, но нет в файлах конфигурации PAM.
1. Для всех пользователей: /etc/environment
Пэм в Ubuntu вызывает переменные среды, перечисленные в /etc/environment
должен быть установлен, если этот файл существует, что по умолчанию и происходит. Именно так чаще всего задаются переменные среды для всех пользователей.
$ cat /etc/environmentPATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Если вы должны установить переменные среды для все учетные записи пользователей, а не только ваша учетная запись пользователя, тогда изменение этого файла, вероятно, будет вашим лучшим выбором. Я рекомендую сначала создать резервную копию. Один из способов создать резервную копию этого файла - запустить:
sudo cp /etc/environment /etc/environment.orig
То .orig
расширение специально не требуется - вы можете называть файл резервной копии любым именем, которое не вводит в заблуждение или уже используется. (Кроме того .orig
, .old
, .backup
и .bak
являются общими.)
Вы можете редактировать этот файл любым из способов, которыми вы могли бы редактировать любой другой файл от имени пользователя root (sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
и т.д.)
/etc/environment
не поддерживает автоматическое включение старого значения переменной. Но обычно в этом нет необходимости, поскольку большую часть времени вы устанавливаете переменную среды для всех пользователей путем редактирования /etc/environment
В любом случае, вы бы хотели, чтобы это было его начальное значение при входе пользователя в систему. Затем пользователь может изменить его по своему усмотрению. Как правило, пользователям полезно иметь возможность это делать.
2. Для всех пользователей: /etc/security/pam_env.conf
PAM считывает переменные среды для всех пользователей из /etc/security/pam_env.conf
, указанный с тем же синтаксисом, который используется в per-user ~/.pam_environment
файлы (см. ниже).
Когда одна и та же переменная среды установлена в обоих /etc/environment
и /etc/security/pam_env.conf
, значение в pam_env.conf
используется - даже если это значение указано как DEFAULT
скорее, чем OVERRIDE
.
Однако, когда вы заменяете строку в environment
с одним в pam_env.conf
, вы можете включить содержимое замененного значения. Смотрите раздел ниже, посвященный .pam_environment
для получения подробной информации (поскольку он использует тот же синтаксис).
Обычно нет необходимости редактировать pam_env.conf
и вы должны быть очень осторожны, если вы это сделаете, поскольку в бесформенный line обычно вообще запрещает вход в систему всем обычным учетным записям пользователей! Например, значение по умолчанию pam_env.conf
содержит строки:
#PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Это представлено в качестве одного из нескольких примеров. Одна из вещей, которые он иллюстрирует, - это то, как разделить назначение на несколько строк с помощью \
. Предположим, вы должны были раскомментировать только первую строку, но забыли раскомментировать вторую строку:
PATH DEFAULT=${HOME}/bin:/usr/local/bin:/bin\#:/usr/bin:/usr/local/bin/X11:/usr/bin/X11
Не делай этого!
Я только что проверил это сам случайно, и это помешало любому пользователю успешно войти в систему. Чтобы исправить это, мне пришлось загрузиться в режиме восстановления и изменить его обратно. (К счастью, я сделал это на виртуальной машине, которую использую только для тестирования, так что это не вызвало у меня никаких проблем.)
3. Для одного пользователя: .pam_environment
в домашнем каталоге пользователя
Один из способов установить переменную среды для одного пользователя заключается в том, чтобы этот пользователь мог редактировать (или создавать) .pam_environment
в их домашнем каталоге. Значения, заданные в этом файле, заменяют значения, заданные в глобальном /etc/environment
файл.
.pam_environment
не является частью скелета файлов, который копируется в домашнюю папку пользователя при первоначальном создании учетной записи пользователя. Однако, если вы создадите этот файл в своем домашнем каталоге, вы можете использовать его для установки переменных среды, таких как PATH
. В отличие от /etc/environment
(но, как /etc/security/pam_env.conf
), для каждого пользователя .pam_environment
файлы поддерживают расширение старого значения переменной среды в новое. Однако они не являются сценариями оболочки, и для достижения этой цели вы должны использовать специальный синтаксис, который несколько отличается от синтаксиса, который вы использовали бы в файле типа .profile
.
Например, если бы у вас был bin2
каталог в вашем домашнем каталоге, который вы хотели добавить в конец PATH
, вы могли бы сделать это, добавив эту строку в .pam_environment
:
PATH DEFAULT=${PATH}:/home/@{PAM_USER}/bin2
Видеть то ~/.pam_environment
подраздел от Переменные среды (из которого приведенный выше пример полностью адаптирован), man pam_env
, и man pam_env.conf
для получения более подробной информации.
Хотя это когда-то рекламировалось как предпочтительный способ для пользователей Ubuntu изменять или добавлять переменные среды и по-прежнему считается разумным и приемлемым выбором, вы должны быть осторожны при редактировании .pam_environment
. Нравится вносить изменения в общесистемную /etc/security/pam_env.conf
(см. выше), искаженная строка в пользовательском .pam_environment
файл предотвратит успешный вход в систему. (Я проверил это - на этот раз специально.) Для получения информации о том, как рекомендации иметь развитый, видишь Гуннар Хьялмарссон'с комментарии ниже и этот ubuntu-devel
обсуждение.
Такая ошибка гораздо менее серьезна, в общем, чем искаженная линия в pam_env.conf
, потому что это затрагивает только одного пользователя. Однако в случае настольной системы Ubuntu только с одной учетной записью пользователя, которая позволяет входить в систему, такая ошибка при редактировании .pam_environment
будет так же плохо, как ошибка редактирования pam_env.conf
-- если вы еще не вошли в систему, вы не сможете исправить это без загрузки в режиме восстановления (или с USB-накопителя и т.д.).
(Если у вас есть другие учетные записи пользователей, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не являются администраторами и не могут sudo
для root, они все еще могут работать su ваш аккаунт
и вам будет предложено ввести свой (не их) пароль. То гость учетная запись, однако, не может этого сделать, так как ей запрещено использовать su
чтобы принять личность другого пользователя.)
4. Для всех пользователей: /etc/profile
и файлы внутри /etc/profile.d/
Оболочки, совместимые с Bourne (включая bash
, пользовательская оболочка по умолчанию в Ubuntu) запустите команды в /etc/profile
при вызове в качестве оболочки входа в систему.
Ubuntu - это /etc/profile
заканчивается тем, что:
if [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done unset ifi
Это приводит к тому, что команды в любом файле в /etc/profile.d/
каталог, имя которого заканчивается на .sh
также должен быть запущен.
Большинство дисплейных менеджеров вызывают команды в /etc/profile
(и, таким образом, файлы в /etc/profile.d
) также будет выполняться для графических входов в систему. Однако, не все это делают, и это весомый аргумент в пользу использования вместо этого возможностей, предоставляемых PAM (см. Выше) - если только в этой системе никогда не будет никаких графических входов в систему, что может иметь место, например, если это сервер без установленного графического интерфейса.
Традиционно задаются общесистемные переменные среды в /etc/profile
, но это часто уже не лучший выбор. Если вы не можете установить переменную среды в /etc/environment
, и вы должны установить его для всех пользователей, тогда, вероятно, лучше создать новый файл в /etc/profile.d/
чем редактировать /etc/profile
сам. Одна из причин этого заключается в том, что при обновлении Ubuntu может появиться новое значение по умолчанию /etc/profile
файл. В зависимости от того, как вы выполняете обновление, либо будет сохранен старый файл (с вашими изменениями), предшествующий этому конкретному обновленному файлу конфигурации, либо вам будет предложено разобраться с ситуацией.
Когда одна и та же переменная среды установлена в обоих /etc/profile
и один или несколько файлов в /etc/profile.d
, который выполняется последним? Это зависит от того, выполняются ли команды в /etc/profile
которые устанавливают их отображение до или после файлов в profile.d
были получены (с помощью кода, который я процитировал выше). Команды в /etc/profile
выполняются в том порядке, в котором они появляются.
/etc/profile
это сценарий оболочки, и его синтаксис таков нет то же самое, что и в файлах конфигурации PAM, рассмотренных выше. Его синтаксис такой же, как и синтаксис для каждого пользователя ~/.profile
файл (см. ниже).
Если вам нужно написать код, который решает следует ли добавлять определенный каталог в PATH
(и сделать это для всех пользователей), вы не сможете использовать /etc/environment
или /etc/security/pam_env.conf
чтобы сделать это. Это, пожалуй, основная ситуация, в которой лучше использовать /etc/profile
или /etc/profile.d/
вместо.
5. Для одного пользователя: .bash_profile
в домашнем каталоге пользователя
Если у пользователя есть ~/.bash_profile
, bash использует его вместо ~/.profile
или ~/.bash_login
(см. ниже). Обычно у вас не должно быть .bash_profile
в вашем домашнем каталоге.
Если вы это сделаете, он обычно должен содержать команду для исходного кода ~/.profile
(например, . "$HOME/.profile"
). В противном случае содержимое каждого пользователя .profile
файл вообще не запускается.
6. Для одного пользователя: .bash_login
в домашнем каталоге пользователя
Если у пользователя есть ~/.bash_login
, bash использует его вместо ~/.profile
(см. ниже), если только ~/.bash_profile
существует, и в этом случае ни один из других не будет использоваться, если он не получен из `~/.bash_login.
Как и в случае с .bash_profile
, обычно у вас не должно быть .bash_login
файл в вашем домашнем каталоге.
7. Для одного пользователя: .profile
в домашнем каталоге пользователя.
Когда оболочка в стиле Bourne запускается как оболочка входа в систему, она выполняет команды в /etc/profile
(который обычно включает команды, вызывающие команды в файлах в /etc/profile.d/
будет запущен - см. выше). После этого он запускает команды в .profile
в домашнем каталоге пользователя. Этот файл является отдельным для каждого пользователя. (Bash на самом деле работает .bash_profile
или .bash_login
вместо этого, если они существуют - но для пользователей в системе Ubuntu эти файлы редко должны существовать или существуют. Для получения более подробной информации см. Выше и 6.2 Файлы запуска Bash в руководство по Bash.)
~/.profile
таким образом, это основное место для размещения пользователем команд, которые выполняются при входе в систему. Это традиционное место для вас, чтобы установить свой PATH
, но поскольку Ubuntu имеет модуль pam_env и поддерживает ~/.pam_environment
, вам следует подумать об этом.
Как и в случае с /etc/profile
, не все дисплейные менеджеры запускают этот файл для графического входа в систему, хотя большинство из них это делают. Это причина предпочесть ~/.pam_environment
для настройки переменных среды (как бы кто-то ни предпочитал /etc/environment
к /etc/profile
).
Вы можете расширить переменные среды, в том числе PATH
сам по себе, когда вы устанавливаете PATH
в .pam_environment
(см. выше). Однако, если вам нужно установить PATH
более изощренным способом вам, возможно, придется использовать свой .profile
вместо. В частности, если вы хотите проверять, существует ли каталог каждый раз, когда пользователь входит в систему, и добавлять его только в PATH
если это произойдет, то вы не сможете использовать свой .pam_environment
файл, чтобы добавить этот каталог в ваш PATH
.
Например, значение по умолчанию для каждого пользователя .profile
файл на Ubuntu привык закончить с:
# set PATH so it includes user's private bin if it existsif [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH"fi
Видеть Гуннар Хьялмарссон'с как на Ответ командира байта для получения подробной информации.
Это проверяет, есть ли у вас bin
подкаталог вашего домашнего каталога. Если это так, он добавляет этот подкаталог в начало вашего PATH
.
Этот список опускает некоторые возможности.
Существуют и другие способы установки переменных среды при входе пользователей в систему, которые в большей степени зависят от типа входа в систему. Например, иногда у вас могут быть переменные среды, которые устанавливаются только для графических входов в систему или только для удаленных входов на основе SSH. Приведенный выше список не охватывает такие случаи.
Я пропустил несколько файлов, в которых люди иногда определяют переменные среды, например ~/.bashrc
и /etc/bash.bashrc
, потому что они обычно не являются рекомендуемыми местами для установки PATH
и редко бывает так, что вы действительно должны использовать их для этой цели. Если вы используете эти файлы для добавления каталогов в PATH
, то иногда они будут добавляться много раз и очень сбивают с толку, когда вы изучаете $PATH
. (В крайних случаях это может замедлить работу, но обычно это просто вопрос сохранения чистоты и понятности.)
С bash
это оболочка входа в Ubuntu по умолчанию для пользователей, и большинство пользователей используют ее или какую-либо другую оболочку, совместимую с POSIX, я опустил информацию о том, как переменные среды устанавливаются в других оболочках, отличных от Bourne, таких как tcsh
.