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

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

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

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

88
задан 31 December 2016 в 02:45

5 ответов

Резюме:

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

     PATH = "/ your / additional  / путь: $ ПУТЬ "
    ПУТЬ = "$ ПУТЬ: / ваш / дополнительный / путь"
     

    Обратите внимание, что приоритеты путей идут по убыванию слева направо, поэтому первый путь имеет наивысший приоритет. Если вы добавите свой путь слева от $ 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"):

     # установите PATH, чтобы он включал личную корзину пользователя, если она существует
    если [-d "$ HOME / bin"];  тогда
      PATH = "$ HOME / bin: $ PATH"
    фи
     

    Вы видите, что старое значение PATH здесь повторно используется, а новый путь добавляется только к началу, а не перезаписывает все. Если вы хотите вручную добавить новые пути, вы также должны всегда сохранять старое значение $ PATH где-нибудь в новой строке.

    Этот сценарий инициализации читается только оболочками пользователя, которому он принадлежит , но есть еще одно условие:

     # ~ / .profile: выполняется интерпретатором команд для оболочек входа.
     # Этот файл не читает bash (1), если ~ / .bash_profile или ~ / .bash_login
     # существует.
     

    Итак, если вы используете оболочку Bash по умолчанию, вам следует убедиться, что у вас нет ~ / .bash_profile или ~ / .bash_login , если вы хотите, чтобы изменения в ~ / .profile , чтобы иметь эффект для вашего пользователя.


Чтобы получить полное представление о переменных среды, см .: https://help.ubuntu.com/community/EnvironmentVariables


Связанный вопрос: разница между bash.bashrc и файлом / etc / environment

105
ответ дан 22 November 2019 в 23:39

Это Ответ в основном касается порядка, в котором переменные среды, такие как PATH , назначаются , когда они указаны в разных файлах конфигурации. Я также рассказываю, где их обычно следует устанавливать, но в приведенном ниже списке не перечислены файлы в том порядке, в котором вы должны их использовать. Для получения общей информации о настройке PATH и других переменных среды в Ubuntu я также рекомендую прочитать EnvironmentVariables и другие ответы на этот вопрос.

Предпочтительное место для установки PATH зависит от , для каких пользователей вам нужно установить его, и , когда и как вы хотите его установить. Частично ваше решение будет заключаться в том, хотите ли вы установить переменную среды для всех пользователей или для каждого пользователя. Если вы не уверены, я рекомендую установить его только для одного пользователя (например, для вашей учетной записи), а не для всей системы.

Как AlexP говорит , переменная среды 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 , указанных с тем же синтаксисом, что и в per -user ~ / .pam_environment файлы (см. ниже).

Когда одна и та же переменная среды установлена ​​как в / etc / environment , так и в / etc / security / pam_env .conf , используется значение из pam_env.conf - даже если это значение указано как DEFAULT , а не OVERRIDE .

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

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 , таким образом, является основным местом для ввода пользователем команд, которые запускаются при входе в систему. Это традиционное место для установки ПУТЬ , но поскольку Ubuntu имеет модуль pam_env и поддерживает ~ / .pam_environment , вам следует рассмотреть возможность его использования.

Как и / etc / profile , не все диспетчеры дисплея запускают этот файл для графического входа в систему, хотя большинство из них это делает. Это причина предпочесть ~ / .pam_environment для установки переменных среды (так же, как / etc / environment вместо / etc / profile ).

Вы можете расширить переменные среды, включая сам PATH , если вы установите PATH в .pam_environment (см. Выше). Однако, если вам нужно установить ПУТЬ более сложным способом, вам, возможно, придется использовать вместо него ваш .profile . В частности, если вы хотите проверять, существует ли каталог каждый раз, когда пользователь входит в систему, и добавляете его только в PATH , если он есть, то вы не сможете использовать свой .pam_environment , чтобы добавить этот каталог в ваш ПУТЬ .

Например, файл по умолчанию для каждого пользователя .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 .

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

В этом списке отсутствуют некоторые возможности.

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

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

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

31
ответ дан 22 November 2019 в 23:39

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

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

4
ответ дан 22 November 2019 в 23:39

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

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

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

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

1
ответ дан 22 November 2019 в 23:39

Проверьте свой файл / etc / environment . Он должен содержать только буквальный путь, т.е. он не должен содержать что-то вроде " $ PATH = $ PATH: ".

Это вызовет ошибку в вашей системе и заставит вас застрять в цикле входа в систему .

-1
ответ дан 5 January 2021 в 22:30

Другие вопросы по тегам:

Похожие вопросы: