Установка переменной PATH в / etc / environment vs .profile

58

Где предпочтительное место для установки PATHenvvar?

~/.profileили /etc/environment?

Что тот случай , когда PATHустанавливается в обоих местах? Является ли конечный результат объединением обоих значений, установленных в этих двух местах?

pkaramol
источник
Конечно, последнее назначение в PATH превалирует. Большинство сценариев устанавливают это явно в начале сценария.
AlexP
3
См help.ubuntu.com/community/... .
Edwinksl

Ответы:

72

Резюме:

  • Если вы хотите добавить путь (например /your/additional/path) к вашему PATHпеременному для текущего пользователя , а не для всех пользователей компьютера, обычно положить его в конце , ~/.profileкак в одном из этих двух примеров:

    PATH="/your/additional/path:$PATH"
    PATH="$PATH:/your/additional/path"
    

    Обратите внимание, что приоритеты пути уменьшаются слева направо, поэтому первый путь имеет самый высокий приоритет. Если вы добавите свой путь слева от него $PATH, он будет иметь самый высокий приоритет, а исполняемые файлы в этом месте переопределят все остальные. Если вы добавите свой путь справа, он будет иметь самый низкий приоритет, и предпочтительными будут исполняемые файлы из других мест.

  • Однако, если вам нужно установить эту переменную среды для всех пользователей, я бы все равно не рекомендовал касаться, /etc/environmentа создавать файл с именем файла, оканчивающимся на .shin /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

Byte Commander
источник
2
В настоящее время ~/.profileне проверяет существование ~/bin, но он просто имеет строку:PATH="$HOME/bin:$HOME/.local/bin:$PATH"
Гуннар Хьялмарссон
1
@GunnarHjalmarsson Определите «сегодня», пожалуйста? У меня работает 16.04, и вот так это выглядит.
Byte Commander
2
/etc/skel/.profileв 16.04 есть строка, которую я упомянул. Вы очевидно создали своего пользователя в предыдущем выпуске.
Гуннар Хьялмарссон
1
@GunnarHjalmarsson Спасибо за информацию - примерно пять минут назад я думал, что по умолчанию ~/.profileвсе еще есть, но вы правы - /etc/skel/.profileее нет в моей обновленной системе 16.04 (и учетная запись пользователя, созданная при установке 16.04 на другая машина не имеет их в своих .profile).
Элия ​​Каган,
2
«... выполняется как обычные сценарии оболочки всеми оболочками во время их инициализации». Я думаю, что это вводит в заблуждение. Могу предположить (для некоторых), что простое открытие не входящей в систему оболочки терминала с рабочего стола с графическим интерфейсом пользователя выполнит / etc / profile, чего не будет askubuntu.com/questions/155865/…
Ястребиный глаз Паркер
22

Этот ответ в основном касается порядка, в котором переменные среды, например 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являются общими.)

Вы можете редактировать этот файл в любом из способов , вы можете редактировать любой другой файл в качестве корневого пользователя ( 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файле пользователя будет препятствовать успешному входу в систему. (Я испытал это. - нарочно на этот раз) Для получения информации о том , как эти рекомендации были эволюционировали см Гуннар Hjalmarsson «s комментарии ниже и это ubuntu-develобсуждение .

В общем , такая ошибка гораздо менее серьезна, чем неправильная линия pam_env.conf, потому что она затрагивает только одного пользователя. Однако в случае настольной системы Ubuntu, в которой только одна учетная запись пользователя позволяет .pam_environmentвходить в систему, такая ошибка при редактировании будет такой же плохой, как и ошибка редактирования pam_env.conf- если вы еще не вошли в систему, вы не сможете исправить это без загрузки в режиме восстановления (или с живого USB и т. д.).

(Если у вас есть другие учетные записи, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не являются администратором и не могут sudoполучить root-права, они все равно могут работать, и вам будет предложено ввести ваш (не их) пароль Однако гостевая учетная запись не может этого сделать, поскольку ее нельзя использовать для установления личности другого пользователя.)su your-accountsu

4. Для всех пользователей: /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/вместо нее .

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

См Гуннар Hjalmarsson «s комментарий на ответ Byte командора для деталей.

Это проверяет, есть ли у вас binподкаталог вашего домашнего каталога. Если это так, он добавляет этот подкаталог в начало вашего PATH.

Этот список пропускает некоторые возможности.

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

Я пропустил несколько файлов, в которых люди иногда определяют переменные окружения, например ~/.bashrcи /etc/bash.bashrc, потому что они обычно не рекомендуются для установки, PATHи редко вы действительно должны использовать их для этой цели. Если вы используете эти файлы для добавления каталогов PATH, то они иногда будут добавляться много раз, и это очень сбивает с толку при изучении $PATH. (В крайних случаях это может замедлить ход событий, но обычно это просто вопрос поддержания чистоты и понятности.)

Так bashкак это пользовательская оболочка Ubuntu по умолчанию для пользователей, и большинство пользователей используют ее или какую-либо другую POSIX-совместимую оболочку, я пропустил информацию о том, как переменные окружения устанавливаются в других оболочках, отличных от стиля Борна, таких как tcsh.

Элия ​​Каган
источник
1
[комментарий # 1 из 2] Спасибо за это подробное описание! (Я сделал небольшое редактирование.) Однако у меня есть сомнения относительно рекомендуемого способа (ов). Несколько лет назад EnvironmentVariables упомянуто /etc/environment/ , ~/.pam_environmentкак в рекомендованных файлах. После консультации с разработчиками я изменил его , чтобы быть нейтральным между РАМ и /etc/profile.d/*.sh/ ~/.profile, и я до сих пор склонны смотреть на это таким образом.
Гуннар Хьялмарссон,
1
[комментарий № 2 из 2] Вы упомянули пару аргументов в пользу PAM. Важные аргументы в пользу /etc/profile.d/*.sh/ ~/.profileзаключаются в том, что синтаксис проще и что lightdm / gdm прощают в случае ошибок (даже синтаксические ошибки не мешают вам войти в систему, а просто приводят к предупреждающим сообщениям).
Гуннар Хьялмарссон
Когда вы говорите pam_env.so, вы имели в виду pam_env.conf?
Йохан Буле
@ JohanBoulé Да, я имел в виду pam_env.conf. Спасибо! Я редактировал, чтобы исправить это.
Элия ​​Каган
3

Файл / etc / environment не является файлом сценария, в котором вы не можете использовать экспорт, и он не поддерживает расширение переменных типа $ HOME, просто пары simplevariable = value. Таким образом, чтобы использовать этот файл, вам нужно просто добавить свой путь к существующему определению, специально предназначенному для общесистемных настроек переменных среды. по одному в строке. В частности, этот файл хранит общесистемные настройки языка и пути.

~ / .profile - этот файл запускается всякий раз, когда выполняется оболочка bash, обычно рекомендуется для переменных среды, однако он имеет недостаток, заключающийся в том, что он вызывается только оболочками входа в систему, поэтому для того, чтобы он вступил в силу, вам потребуется выйти из системы и вернуться обратно - или хотя бы запустить новую оболочку входа в систему.

eGhoul
источник
1

Предпочтительное место для установки переменных среды зависит от нескольких вещей:

  1. Вы единственный, кто пользуется компьютером:
    • В этом случае лучшее место для установки будет в том, /etc/environmentчто нет опасности _unuthorized доступа.
  2. Если система используется многими
    • Если переменные должны быть доступны всем, то местоположение будет /etc/environment, но
    • если отдельные пользователи должны были выбрать доступ к ним, то каждый из~/.profile них должен установить свои права в отношении каждого пользователя системы, поскольку он находится в домашнем каталоге каждого пользователя.

Система прочитает /etc/environmentперед чтением ~/.profile. Нет конкатенации не происходит и как Alex P сказал последнее назначение на превалирует пути.

Для более подробного ознакомления с факторами, которые определяют, как ~/.profileи как /etc/environmentработать с другими такими местами, перейдите сюда и сюда , так как эти факторы будут влиять на то, как вы используете эти места.

Джордж Удосен
источник