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

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

Где лучше всего установить PATHenvvar?

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

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

решение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в новом значении, так что предыдущие записи сохраняются.

Таким образом, на практике, когда PATHis устанавливается из нескольких файлов, он обычно содержит записи, указанные во всех файлах. Но это происходит только потому, что все файлы, которые его устанавливают, кроме первого, обычно ссылаются на 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 — нет:

  1. общесистемный

    /etc/profile- Редактировать его напрямую - не очень хорошая идея.
    /etc/profile.d/*.sh- источник/etc/profile

  2. сеанс в целом

    ~/.profile

https://help.ubuntu.com/community/EnvironmentVariables#A.2Fetc.2Fprofile.d.2F.2A.sh

Связанный контент