Где лучше всего установить PATH
envvar?
~/.profile
или /etc/environment
?
Что происходит, когда PATH
is установлено в обоих местах? Является ли конечный результат конкатенацией обоих значений, установленных в этих двух местах?
решение1
Краткое содержание:
Если вы хотите добавить путь (например
/your/additional/path
, ) к своейPATH
переменной только для текущего пользователя, а не для всех пользователей вашего компьютера, вы обычно указываете его в конце,~/.profile
как в одном из этих двух примеров:PATH="/your/additional/path:$PATH" PATH="$PATH:/your/additional/path"
Обратите внимание, что приоритеты путей убывающие слева направо, поэтому первый путь имеет наивысший приоритет. Если вы добавите свой путь слева от
$PATH
, он будет иметь наивысший приоритет, и исполняемые файлы в этом расположении будут переопределять все остальные. Если вы добавите свой путь справа, он будет иметь самый низкий приоритет, и исполняемые файлы из других расположений будут иметь приоритет.Однако если вам нужно установить эту переменную среды для всех пользователей, я бы все равно не рекомендовал трогать,
/etc/environment
а создать файл с именем файла, заканчивающимся.sh
на/etc/profile.d/
./etc/profile
Скрипт и все скрипты в/etc/profile.d
являются глобальным эквивалентом личного скрипта каждого пользователя~/.profile
и выполняются как обычные скрипты оболочки всеми оболочками во время их инициализации.
Более детально:
/etc/environment
это системный файл конфигурации, что означает, что он используется всеми пользователями. Он принадлежитroot
хотя, поэтому вам нужно быть администратором и использоватьsudo
его для изменения.~/.profile
один из ваших собственных скриптов инициализации оболочки пользователя. У каждого пользователя есть свой скрипт, и он может редактировать свой файл, не влияя на другие./etc/profile
и/etc/profile.d/*.sh
являются глобальными скриптами инициализации, которые эквивалентны~/.profile
для каждого пользователя. Глобальные скрипты выполняются до пользовательских скриптов; и основной скрипт/etc/profile
выполняет все*.sh
скрипты/etc/profile.d/
непосредственно перед выходом.
Файл
/etc/environment
обычно содержит только эту строку:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
Он устанавливает
PATH
переменную для всех пользователей в системе на это значение по умолчанию, которое не следует менять в значительной степени. По крайней мере, вам не следует удалять из него какие-либо важные пути, такие как/bin
,/sbin
,/usr/bin
и ./usr/sbin
Этот файл читается как один из первых файлов конфигурации каждой оболочкой каждого пользователя. Обратите внимание, что этоне скрипт оболочки. Это просто файл конфигурации, который каким-то образом анализируется и может содержать только назначения переменных среды!
Файл
~/.profile
может содержать много вещей, по умолчанию он содержит, среди прочего, проверку~/bin
существования каталога и добавление его к существующей переменной пользователяPATH
, например, так (в старых выпусках Ubuntu до 16.04 — где он добавляется безусловно — и в 18.04, где также добавляется "~/.local/bin"):# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
Вы видите, что старое значение
PATH
здесь используется повторно, а новый путь просто добавляется в начало, а не перезаписывает все. Когда вы вручную хотите добавить новые пути, вы также должны всегда сохранять старое$PATH
значение где-то в новой строке.Этот скрипт инициализации читается только оболочками пользователя, которому он принадлежит, но есть еще одно условие:
# ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists.
Поэтому, если вы используете оболочку Bash по умолчанию, вам следует убедиться, что у вас нет
~/.bash_profile
или~/.bash_login
если вы хотите, чтобы изменения в ней~/.profile
повлияли на вашего пользователя.
Для полного понимания переменных среды см.: https://help.ubuntu.com/community/EnvironmentVariables
Сопутствующий вопрос:разница между файлами bash.bashrc и /etc/environment
решение2
Этот ответ в основном опорядок, в котором
PATH
назначаются переменные окружения, напримеркогда указано в разных файлах конфигурации. Я также рассказываю, где вы обычно должны их устанавливать, но список ниже не перечисляет файлы в том порядке, в котором вы должны их использовать. Для получения общей информации о настройкеPATH
и других переменных среды в Ubuntu я также рекомендую прочитатьПеременные средыи другие ответы на этот вопрос.
Предпочтительное место установки PATH
зависит откакие пользователивам нужно установить его для икогда и каквы хотите, чтобы он был установлен. Часть вашего решения будет зависеть от того, хотите ли вы, чтобы переменная среды была установлена для всех пользователей или для каждого пользователя. Если вы не уверены, то я рекомендую установить ее только для одного пользователя (например, для вашей учетной записи), а не для всей системы.
КакАлексП говорит, PATH
переменная окружения будет иметь то же значение, что и былапоследний назначенный. На практике,большинствоиз установленного вами времени PATH
, вы включаетестарыйзначение PATH
в новом значении, так что предыдущие записи сохраняются.
Таким образом, на практике, когда PATH
is устанавливается из нескольких файлов, он обычно содержит записи, указанные во всех файлах. Но это происходит только потому, что все файлы, которые его устанавливают, кроме первого, обычно ссылаются на PATH
саму переменную, в результате чего ее старое значение включается в новое.
Таким образом, по сути, вы спрашиваете о порядке, в котором PATH
вступают в силу настройки в различных файлах.
Ниже перечислены общие места для настройки PATH
в том порядке, в котором они вступают в силу при входе пользователя в систему.нетв том порядке, в котором вам обычно следует их использовать. Каждое из перечисленных ниже мест является разумным выбором для установкиPATH
внекоторыйситуации, но лишь немногие из них являются хорошим выбором в большинстве случаев.
В списке ниже вы увидите некоторые имена каталогов, например ~/.profile
. Если вы не знакомы срасширение тильды, ~/
относится к домашнему каталогу текущего пользователя. Я в основном использую этот синтаксис для компактности. Он поддерживается в скриптах оболочки, нонетв файлах конфигурации PAM.
1. Для всех пользователей:/etc/environment
ПАМв Ubuntu приводит к установке переменных окружения, перечисленных в /etc/environment
, если этот файл существует, что по умолчанию и происходит. Именно так чаще всего устанавливаются переменные окружения для всех пользователей.
$ cat /etc/environment
PATH="/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
, указанные с тем же синтаксисом, который используется в файлах для каждого пользователя ~/.pam_environment
(см. ниже).
Если одна и та же переменная среды задана как в , так /etc/environment
и /etc/security/pam_env.conf
в , используется значение в pam_env.conf
, даже если это значение указано как , DEFAULT
а не OVERRIDE
.
Однако, когда вы заменяете строку в environment
на строку в pam_env.conf
, вы можете включить содержимое заменяемого значения. .pam_environment
Подробности см. в разделе ниже (так как он использует тот же синтаксис).
Обычно нет необходимости редактировать pam_env.conf
ивам следует быть очень осторожным, если вы это сделаете, так какнеправильно сформированныйстрока обычно не позволяет всем обычным учетным записям пользователей входить в систему вообще! Например, по умолчанию 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
не позволит успешно войти в систему. (Я проверил это — на этот раз намеренно.) Для получения информации о том, какрекомендациииметьэволюционировал, видетьГуннар Хьялмарссон'sКомментарии нижеиэто ubuntu-devel
обсуждение.
Такая ошибка гораздо менее серьезна,в общем, чем неправильно сформированная строка в pam_env.conf
, поскольку она влияет только на одного пользователя. Однако в случае настольной системы Ubuntu с только одной учетной записью пользователя, которая позволяет входить в систему, такая ошибка при редактировании .pam_environment
будет столь же плохой, как и ошибка редактирования pam_env.conf
— если вы еще не вошли в систему, вы не сможете исправить ее без загрузки в режиме восстановления (или с живого USB и т. д.).
(Если у вас есть другие учетные записи пользователей, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не являются администраторами и не могут sudo
получить права root, они все равно могут запустить приложение и получить запрос на ввод вашего (не своего) пароля.su your-account
гостьОднако учетная запись не может этого сделать, поскольку ее запрещено использовать 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 i
fi
Это приведет к тому, что команды в любом файле в /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"
). В противном случае содержимое файла per-user .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 exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
ВидетьГуннар Хьялмарссон'sкомментарийнаОтвет Byte Commanderдля получения подробной информации.
Это проверяет, есть ли у вас bin
подкаталог вашего домашнего каталога. Если да, то он добавляет этот подкаталог в начало вашего PATH
.
В этом списке не учтены некоторые возможности.
Существуют и другие способы установки переменных среды при входе пользователей, которые в большей степени зависят от типа входа. Например, у вас могут быть переменные среды, которые устанавливаются только для графических входов или только для удаленных входов на основе SSH. Приведенный выше список не охватывает такие случаи.
Я пропустил несколько файлов, в которых люди иногда определяют переменные окружения, например ~/.bashrc
и /etc/bash.bashrc
, потому что они обычно не являются рекомендуемыми местами для установки PATH
, и редко когда вы действительно должны использовать их для этой цели. Если вы используете эти файлы для добавления каталогов в PATH
, то они иногда будут добавляться много раз и очень запутанны, когда вы изучаете $PATH
. (В крайних случаях это может замедлить работу, но обычно это просто вопрос поддержания чистоты и понятности.)
Поскольку bash
это оболочка входа в Ubuntu по умолчанию для пользователей, и большинство пользователей используют ее или какую-либо другую POSIX-совместимую оболочку, я опустил информацию о том, как задаются переменные среды в других оболочках, отличных от Bourne-стиля, таких как tcsh
.
решение3
/etc/окружающая средаfile не является файлом скрипта, вы не можете использовать экспорт там, и он не поддерживает расширение переменных типа $HOME, только простые пары переменная=значение. Поэтому, чтобы использовать этот файл, вам нужно просто добавить свой путь к существующему определению, специально предназначено для общесистемных настроек переменных среды. по одному на строку. В частности, этот файл хранит общесистемные настройки локали и пути.
~/.профиль- Этот файл выполняется при каждом запуске оболочки bash, обычно рекомендуется для переменных окружения, однако его недостатком является то, что он вызывается только оболочками входа, поэтому для того, чтобы он вступил в силу, вам нужно будет выйти из системы и войти снова - или, по крайней мере, запустить новую оболочку входа.
решение4
bash читает эти файлы, а zsh — нет:
общесистемный
/etc/profile
- Редактировать его напрямую - не очень хорошая идея.
/etc/profile.d/*.sh
- источник/etc/profile
сеанс в целом
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh