Установка переменной PATH в /etc/environment vs .profile
Где предпочтительное место для установки PATH
envvar?
~/.profile
или же /etc/environment
?
Как обстоят дела, когда PATH
устанавливается в обоих местах? Является ли конечный результат объединением обоих значений, установленных в этих двух местах?
6 ответов
Резюме:
Если вы хотите добавить путь (например,
/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 - более новые выпуски добавляют его безоговорочно):# 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
Этот ответ в основном о порядке, в котором переменные среды, такие как
PATH
назначаются, когда указано в разных файлах конфигурации. Я также расскажу, где вы должны их устанавливать, но в приведенном ниже списке файлы не перечислены в том порядке, в котором вы должны их использовать. Для общей информации о настройкеPATH
и другие переменные среды в Ubuntu, я также рекомендую прочитать EnvironmentVariables и другие ответы на этот вопрос.
Предпочтительное место для установки PATH
зависит от того, для каких пользователей вам нужно установить его, и когда и как вы хотите, чтобы он был установлен. Часть вашего решения будет зависеть от того, хотите ли вы установить переменную среды для всех пользователей или для каждого пользователя. Если вы не уверены, то я рекомендую установить его только для одного пользователя (например, вашей учетной записи), а не для всей системы.
Как говорит AlexP, PATH
Переменная окружения будет иметь значение, которое было ей присвоено в последний раз. На практике большую часть времени вы устанавливаете PATH
Вы включаете старое значение PATH
в новом значении, так что предыдущие записи сохраняются.
Таким образом, на практике, когда PATH
устанавливается из нескольких файлов, обычно содержит записи, указанные во всех файлах. Но это происходит только потому, что все файлы, которые его устанавливают, кроме первого, обычно ссылаются на PATH
сама переменная, в результате чего ее старое значение будет включено в новое.
Таким образом, вы фактически запрашиваете порядок, в котором PATH
настройки в различных файлах вступают в силу.
Общие, универсальные места для установки PATH
перечислены ниже в том порядке, в котором они вступают в силу при входе пользователя в систему, а не в том порядке, в котором вы обычно должны их использовать. Каждое из мест, перечисленных ниже, является разумным выбором для настройки PATH
в некоторых ситуациях, но только некоторые из них являются хорошим выбором в большинстве случаев.
В списке ниже вы увидите некоторые имена каталогов, такие как ~/.profile
, Если вы не знакомы с расширением тильды, ~/
ссылается на домашний каталог текущего пользователя. Я в основном использую этот синтаксис для компактности. Он поддерживается в сценариях оболочки, но не в файлах конфигурации PAM.
1. Для всех пользователей: /etc/environment
PAM в 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
подраздел EnvironmentVariables (из которого приведенный выше пример тесно адаптирован), man pam_env
, а также man pam_env.conf
для дальнейших деталей.
Хотя это когда-то рекламировалось как предпочтительный способ для пользователей Ubuntu изменять или добавлять переменные среды и все еще считается разумным и приемлемым выбором, вы должны быть осторожны при редактировании .pam_environment
, Как правки для всей системы /etc/security/pam_env.conf
(см. выше), неправильная линия в пользовательском .pam_environment
файл не позволит войти в систему (Я проверил это - специально на этот раз.) Для получения информации о том, как развивались рекомендации, см. Комментарии Gunnar Hjalmarsson ниже, и это ubuntu-devel
обсуждение.
В общем, такая ошибка гораздо менее серьезна, чем неправильная pam_env.conf
, потому что это влияет только на одного пользователя. Однако в случае настольной системы Ubuntu только с одной учетной записью пользователя, которая позволяет входить в систему, такая ошибка при редактировании .pam_environment
будет так же плохо, как ошибка редактирования pam_env.conf
- если вы еще не вошли в систему, вы не сможете исправить это без загрузки в режиме восстановления (или с живого USB и т. д.).
(Если у вас есть другие учетные записи, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не администратор и не могут sudo
болеть, они все еще могут бежать su your-account
и вам будет предложено ввести ваш (не их) пароль. Однако гостевая учетная запись не может этого сделать, так как запрещено использовать su
взять на себя личность другого пользователя.)
4. Для всех пользователей: /etc/profile
и файлы внутри /etc/profile.d/
Борн-совместимые оболочки (в том числе bash
пользовательская оболочка по умолчанию в Ubuntu) запустите команды в /etc/profile
когда вызывается как оболочка для входа.
Убунту /etc/profile.d
заканчивается:
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"
). В противном случае содержимое каждого пользователя .profile
файл не запускается вообще.
6. Для одного пользователя: .bash_login
в домашнем каталоге пользователя
Если пользователь имеет ~/.bash_login
Bash использует его вместо ~/.profile
(см. ниже), если ~/.bash_profile
существует, и в этом случае ни один из других не будет использоваться, если он не получен из `~/.bash_login.
Как с .bash_profile
Вы, как правило, не должны иметь .bash_login
файл в вашем домашнем каталоге.
7. Для одного пользователя: .profile
в домашнем каталоге пользователя.
Когда оболочка в стиле Борна запускается как оболочка входа в систему, она запускает команды в /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
Подробности смотрите в комментарии Gunnar Hjalmarsson к ответу Byte Commander.
Это проверяет, есть ли у вас bin
подкаталог вашего домашнего каталога. Если это так, он добавляет этот подкаталог в начало вашего PATH
,
Этот список пропускает некоторые возможности.
Существуют и другие способы установки переменных среды при входе пользователей, которые в большей степени зависят от типа входа. Например, вы можете иногда иметь переменные окружения, которые устанавливаются только для графического входа или только для удаленного входа на основе SSH. Приведенный выше список не охватывает такие случаи.
Я пропустил несколько файлов, в которых люди иногда определяют переменные среды, например ~/.bashrc
а также /etc/bash.bashrc
потому что они обычно не рекомендуются для установки PATH
и это редко, что вы действительно должны использовать их для этой цели. Если вы используете эти файлы для добавления каталогов в PATH
, то они иногда будут добавляться много раз, и это очень запутанно, когда вы исследуете $PATH
, (В крайних случаях это может замедлить ход событий, но обычно это просто вопрос поддержания чистоты и понятности.)
поскольку bash
это оболочка входа в систему по умолчанию для пользователей Ubuntu, и большинство пользователей используют ее или какую-либо другую POSIX-совместимую оболочку. Я пропустил информацию о том, как переменные среды задаются в других оболочках, отличных от Bourne, таких как tcsh
,
Файл/etc/environment не является файлом сценария, который вы не можете использовать для экспорта, и он не поддерживает расширение переменных типа $HOME, просто пары simplevariable=value. Таким образом, чтобы использовать этот файл, вам нужно просто добавить свой путь к существующему определению, специально предназначенному для общесистемных настроек переменных среды. по одному в строке. В частности, этот файл хранит общесистемные настройки языка и пути.
~ /.profile - этот файл запускается всякий раз, когда выполняется оболочка bash, обычно рекомендуется для переменных среды, однако его недостатком является то, что он вызывается только оболочками входа в систему, поэтому для того, чтобы он вступил в силу, вам потребуется выйти из системы и вернуться обратно - или хотя бы запустить новую оболочку входа в систему.
Предпочтительное место для установки переменных среды зависит от нескольких вещей:
- Вы единственный, кто пользуется компьютером:
- В этом случае лучшее место для установки будет в
/etc/environment
так как нет опасности _unauthorized доступа.
- В этом случае лучшее место для установки будет в
- Если система используется многими
- Если переменные должны быть доступны всем, то местоположение будет
/etc/environment
, но - если отдельные пользователи должны были выбрать доступ к ним, то каждый должен установить свои в
~/.profile
относится к каждому пользователю системы, поскольку она находится в домашнем каталоге каждого пользователя.
- Если переменные должны быть доступны всем, то местоположение будет
Система будет читать /etc/environment
Перед чтением ~/.profile
, Конкатенация не происходит, и, как сказал Алекс П, последнее назначение пути превалирует.
Для более детального ознакомления с факторами, определяющими, как ~/.profile
а также /etc/environment
поиграйте с другими такими локациями, иди сюда и сюда, так как эти факторы будут влиять на то, как ты используешь эти локации.
bash читает эти файлы, а zsh нет:
общесистемный
- Не рекомендуется редактировать его напрямую.
/etc/profile.d/*.sh
- источник/etc/profile
на весь сеанс
~/.profile
https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh
Проверьте свои /etc/environment
файл. Он должен содержать только буквальный путь, т.е. не должен содержать чего-то вроде "$PATH=$PATH:<any_path_you_want_to_add>
".
Это вызовет ошибку в вашей системе и заставит вас застрять в цикле входа в систему.