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

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

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

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

Резюме:

  • Если вы хотите добавить путь (например /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 existsif [ -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, я также рекомендую прочитать Переменные среды и другие ответы на этот вопрос.

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

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

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

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

Общие места общего назначения для установки PATH перечислены ниже в том порядке, в котором они вступают в силу при входе пользователя в систему, нет в том порядке, в котором вы обычно должны рассмотреть возможность их использования. Каждое из перечисленных ниже мест является разумным выбором для установки PATH в некоторые ситуации, но лишь немногие из них являются хорошим выбором в большинстве случаев.

В приведенном ниже списке вы увидите некоторые имена каталогов, такие как ~/.profile. На случай, если вы не знакомы с расширение тильды, ~/ ссылается на домашний каталог текущего пользователя. Я в основном использую этот синтаксис для компактности. Он поддерживается в сценариях оболочки, но нет в файлах конфигурации PAM.

1. Для всех пользователей: /etc/environment

Пэм в Ubuntu вызывает переменные среды, перечисленные в /etc/environment должен быть установлен, если этот файл существует, что по умолчанию и происходит. Именно так чаще всего задаются переменные среды для всех пользователей.

$ cat /etc/environmentPATH="/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.

Однако, когда вы заменяете строку в environment с одним в pam_env.conf, вы можете включить содержимое замененного значения. Смотрите раздел ниже, посвященный .pam_environment для получения подробной информации (поскольку он использует тот же синтаксис).

Обычно нет необходимости редактировать pam_env.conf и вы должны быть очень осторожны, если вы это сделаете, поскольку в бесформенный line обычно вообще запрещает вход в систему всем обычным учетным записям пользователей! Например, значение по умолчанию 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 файл предотвратит успешный вход в систему. (Я проверил это - на этот раз специально.) Для получения информации о том, как рекомендации иметь развитый, видишь Гуннар Хьялмарссонкомментарии ниже и этот ubuntu-devel обсуждение.

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

(Если у вас есть другие учетные записи пользователей, вы можете войти в систему как другой пользователь и устранить проблему. Даже если они не являются администраторами и не могут sudo для root, они все еще могут работать su ваш аккаунт и вам будет предложено ввести свой (не их) пароль. То гость учетная запись, однако, не может этого сделать, так как ей запрещено использовать 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 ifi

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

Когда оболочка в стиле 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 existsif [ -d "$HOME/bin" ] ; then    PATH="$HOME/bin:$PATH"fi

Видеть Гуннар Хьялмарссонкак на Ответ командира байта для получения подробной информации.

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

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

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

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

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

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

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

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

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

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

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

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

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

Видишь EnvironmentVariables - Community Help Wiki .

Конечно, последнее назначение PATH имеет преимущественную силу. Большинство скриптов явно устанавливают его в начале скрипта.