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

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

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

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

6 ответов

Решение

Резюме:

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

    # 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

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

Вы можете редактировать этот файл любым способом, которым вы можете редактировать любой другой файл как пользователь 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 подраздел EnvironmentVariables (из которого приведенный выше пример тесно адаптирован), man pam_env, а также man pam_env.conf для дальнейших деталей.

Хотя это когда-то рекламировалось как предпочтительный способ для пользователей Ubuntu изменять или добавлять переменные среды и все еще считается разумным и приемлемым выбором, вы должны быть осторожны при редактировании .pam_environment, Как правки для всей системы /etc/security/pam_env.conf (см. выше), неправильная линия в пользовательском .pam_environment файл не позволит войти в систему (Я проверил это - специально на этот раз.) Для получения информации о том, как развивались рекомендации, см. Комментарии Gunnar Hjalmarsson ниже, и это ubuntu-devel обсуждение.

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

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

4. Для всех пользователей: /etc/profile и файлы внутри /etc/profile.d/

Борн-совместимые оболочки (в том числе bash пользовательская оболочка по умолчанию в Ubuntu) запустите команды в /etc/profile когда вызывается как оболочка для входа.

Убунту /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

Подробности смотрите в комментарии Gunnar Hjalmarsson к ответу Byte Commander.

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

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

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

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

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

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

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

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

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

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

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

bash читает эти файлы, а zsh нет:

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

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

  2. на весь сеанс

    ~/.profile

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

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

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

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