Где предпочтительное место для установки PATH
envvar?
~/.profile
или /etc/environment
?
Что тот случай , когда PATH
устанавливается в обоих местах? Является ли конечный результат объединением обоих значений, установленных в этих двух местах?
Где предпочтительное место для установки PATH
envvar?
~/.profile
или /etc/environment
?
Что тот случай , когда PATH
устанавливается в обоих местах? Является ли конечный результат объединением обоих значений, установленных в этих двух местах?
Ответы:
Резюме:
Если вы хотите добавить путь (например /your/additional/path
) к вашему PATH
переменному для текущего пользователя , а не для всех пользователей компьютера, обычно положить его в конце , ~/.profile
как в одном из этих двух примеров:
PATH="/your/additional/path:$PATH"
PATH="$PATH:/your/additional/path"
Обратите внимание, что приоритеты пути уменьшаются слева направо, поэтому первый путь имеет самый высокий приоритет. Если вы добавите свой путь слева от него $PATH
, он будет иметь самый высокий приоритет, а исполняемые файлы в этом месте переопределят все остальные. Если вы добавите свой путь справа, он будет иметь самый низкий приоритет, и предпочтительными будут исполняемые файлы из других мест.
Однако, если вам нужно установить эту переменную среды для всех пользователей, я бы все равно не рекомендовал касаться, /etc/environment
а создавать файл с именем файла, оканчивающимся на .sh
in /etc/profile.d/
. /etc/profile
Сценарий и все сценарии в /etc/profile.d
этом глобальный эквивалент каждого пользователя персональный ~/.profile
и выполнен в виде обычных сценариев оболочки всех оболочек во время их инициализации.
Подробнее:
/etc/environment
это системный файл конфигурации, что означает, что он используется всеми пользователями. root
Хотя он принадлежит , поэтому вам нужно быть администратором и использовать его sudo
для изменения.
~/.profile
является одним из сценариев инициализации личной оболочки вашего собственного пользователя. Каждый пользователь имеет один и может редактировать свой файл, не затрагивая других.
/etc/profile
и /etc/profile.d/*.sh
являются сценариями глобальной инициализации, эквивалентными ~/.profile
для каждого пользователя. Глобальные сценарии выполняются раньше пользовательских сценариев; и main /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
~/.profile
не проверяет существование ~/bin
, но он просто имеет строку:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
/etc/skel/.profile
в 16.04 есть строка, которую я упомянул. Вы очевидно создали своего пользователя в предыдущем выпуске.
~/.profile
все еще есть, но вы правы - /etc/skel/.profile
ее нет в моей обновленной системе 16.04 (и учетная запись пользователя, созданная при установке 16.04 на другая машина не имеет их в своих .profile
).
Этот ответ в основном касается порядка, в котором переменные среды, например
PATH
, присваиваются, когда указываются в разных файлах конфигурации. Я также расскажу, где вы должны их устанавливать, но в приведенном ниже списке файлы не перечислены в том порядке, в котором вы должны их использовать. Для получения общей информации о настройкеPATH
и других переменных среды в Ubuntu я также рекомендую прочитать EnvironmentVariables и другие ответы на этот вопрос.
Предпочтительное место для установки PATH
зависит от того, для каких пользователей вам нужно установить его, и когда и как вы хотите, чтобы оно было установлено. Часть вашего решения будет зависеть от того, хотите ли вы установить переменную среды для всех пользователей или для каждого пользователя. Если вы не уверены, то я рекомендую установить его только для одного пользователя (например, вашей учетной записи), а не для всей системы.
Как говорит AlexP , PATH
переменная окружения будет иметь значение, которое ей было присвоено в последний раз . На практике большую часть установленного времени вы PATH
включаете старое значение PATH
в новое значение, так что предыдущие записи сохраняются.
Таким образом, на практике, когда PATH
устанавливается из нескольких файлов, он обычно содержит записи, указанные во всех файлах. Но это происходит только потому, что все файлы, которые его устанавливают, кроме первого, обычно ссылаются на PATH
саму переменную, в результате чего ее старое значение включается в новое.
Таким образом, вы фактически запрашиваете порядок, в котором PATH
вступают в силу настройки в различных файлах.
Общие места общего назначения для настройки PATH
перечислены ниже в том порядке, в котором они вступают в силу при входе пользователя в систему, а не в том порядке, в котором вы обычно должны их использовать . Каждое из мест, перечисленных ниже, является разумным выбором для настройки PATH
в некоторых ситуациях , но в большинстве случаев только несколько из них являются хорошими.
В списке ниже вы увидите некоторые имена каталогов, такие как ~/.profile
. Если вы не знакомы с расширением тильды , ~/
ссылается на домашний каталог текущего пользователя. Я в основном использую этот синтаксис для компактности. Он поддерживается в сценариях оболочки, но не в файлах конфигурации PAM.
/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
являются общими.)
Вы можете редактировать этот файл в любом из способов , вы можете редактировать любой другой файл в качестве корневого пользователя ( sudoedit /etc/enviromnment
, sudo nano -w /etc/environment
, gksudo gedit /etc/environment
и т.д.)
/etc/environment
не поддерживает автоматическое включение старого значения переменной. Но это, как правило, не нужно, поскольку большую часть времени вы устанавливаете переменную среды для всех пользователей путем редактирования /etc/environment
, в любом случае вы хотите, чтобы это было ее начальное значение, когда пользователь входит в систему. Пользователь может затем изменить его, как ему нравится. Обычно это полезно для пользователей.
/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
Не делай этого!
Я только что проверил это сам по себе, и это помешало любым пользователям войти в систему. Чтобы это исправить, мне пришлось загрузиться в режиме восстановления и вернуть обратно. (К счастью, я сделал это на виртуальной машине, которую я использую только для тестирования, так что это не доставило мне никаких проблем.)
.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
файле пользователя будет препятствовать успешному входу в систему. (Я испытал это. - нарочно на этот раз) Для получения информации о том , как эти рекомендации были эволюционировали см Гуннар Hjalmarsson «s комментарии ниже и это ubuntu-devel
обсуждение .
В общем , такая ошибка гораздо менее серьезна, чем неправильная линия pam_env.conf
, потому что она затрагивает только одного пользователя. Однако в случае настольной системы Ubuntu, в которой только одна учетная запись пользователя позволяет .pam_environment
входить в систему, такая ошибка при редактировании будет такой же плохой, как и ошибка редактирования pam_env.conf
- если вы еще не вошли в систему, вы не сможете исправить это без загрузки в режиме восстановления (или с живого USB и т. д.).
(Если у вас есть другие учетные записи, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не являются администратором и не могут sudo
получить root-права, они все равно могут работать, и вам будет предложено ввести ваш (не их) пароль Однако гостевая учетная запись не может этого сделать, поскольку ее нельзя использовать для установления личности другого пользователя.)su your-account
su
/etc/profile
и файлы внутри/etc/profile.d/
Bourne-совместимые оболочки (включая bash
пользовательскую оболочку по умолчанию в Ubuntu) запускают команды /etc/profile
при вызове в качестве оболочки входа в систему.
Ubuntu /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/
вместо нее .
.bash_profile
в домашнем каталоге пользователяЕсли у пользователя есть ~/.bash_profile
, bash использует его вместо ~/.profile
или ~/.bash_login
(см. Ниже). Вы не должны обычно иметь .bash_profile
в своем домашнем каталоге.
Если вы это сделаете, он обычно должен содержать команду источника ~/.profile
(например, . "$HOME/.profile"
). В противном случае содержимое .profile
файла для пользователя не запускается вообще.
.bash_login
в домашнем каталоге пользователяЕсли у пользователя есть ~/.bash_login
, bash использует его вместо ~/.profile
(см. Ниже), если он не ~/.bash_profile
существует, и в этом случае ни один из остальных не будет использоваться, если он не получен из `~ / .bash_login.
Как и в случае .bash_profile
, вы не должны обычно иметь .bash_login
файл в вашем домашнем каталоге.
.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
См Гуннар Hjalmarsson «s комментарий на ответ Byte командора для деталей.
Это проверяет, есть ли у вас bin
подкаталог вашего домашнего каталога. Если это так, он добавляет этот подкаталог в начало вашего PATH
.
Существуют и другие способы установки переменных среды при входе пользователей, которые в большей степени зависят от типа входа. Например, вы можете иногда иметь переменные окружения, которые устанавливаются только для графического входа или только для удаленного входа на основе SSH. Приведенный выше список не охватывает такие случаи.
Я пропустил несколько файлов, в которых люди иногда определяют переменные окружения, например ~/.bashrc
и /etc/bash.bashrc
, потому что они обычно не рекомендуются для установки, PATH
и редко вы действительно должны использовать их для этой цели. Если вы используете эти файлы для добавления каталогов PATH
, то они иногда будут добавляться много раз, и это очень сбивает с толку при изучении $PATH
. (В крайних случаях это может замедлить ход событий, но обычно это просто вопрос поддержания чистоты и понятности.)
Так bash
как это пользовательская оболочка Ubuntu по умолчанию для пользователей, и большинство пользователей используют ее или какую-либо другую POSIX-совместимую оболочку, я пропустил информацию о том, как переменные окружения устанавливаются в других оболочках, отличных от стиля Борна, таких как tcsh
.
/etc/environment
/ , ~/.pam_environment
как в рекомендованных файлах. После консультации с разработчиками я изменил его , чтобы быть нейтральным между РАМ и /etc/profile.d/*.sh
/ ~/.profile
, и я до сих пор склонны смотреть на это таким образом.
/etc/profile.d/*.sh
/ ~/.profile
заключаются в том, что синтаксис проще и что lightdm / gdm прощают в случае ошибок (даже синтаксические ошибки не мешают вам войти в систему, а просто приводят к предупреждающим сообщениям).
pam_env.so
, вы имели в виду pam_env.conf
?
pam_env.conf
. Спасибо! Я редактировал, чтобы исправить это.
Файл / etc / environment не является файлом сценария, в котором вы не можете использовать экспорт, и он не поддерживает расширение переменных типа $ HOME, просто пары simplevariable = value. Таким образом, чтобы использовать этот файл, вам нужно просто добавить свой путь к существующему определению, специально предназначенному для общесистемных настроек переменных среды. по одному в строке. В частности, этот файл хранит общесистемные настройки языка и пути.
~ / .profile - этот файл запускается всякий раз, когда выполняется оболочка bash, обычно рекомендуется для переменных среды, однако он имеет недостаток, заключающийся в том, что он вызывается только оболочками входа в систему, поэтому для того, чтобы он вступил в силу, вам потребуется выйти из системы и вернуться обратно - или хотя бы запустить новую оболочку входа в систему.
Предпочтительное место для установки переменных среды зависит от нескольких вещей:
/etc/environment
что нет опасности _unuthorized доступа./etc/environment
, но~/.profile
них должен установить свои права в отношении каждого пользователя системы, поскольку он находится в домашнем каталоге каждого пользователя.Система прочитает /etc/environment
перед чтением ~/.profile
. Нет конкатенации не происходит и как Alex P сказал последнее назначение на превалирует пути.
Для более подробного ознакомления с факторами, которые определяют, как ~/.profile
и как /etc/environment
работать с другими такими местами, перейдите сюда и сюда , так как эти факторы будут влиять на то, как вы используете эти места.