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

Резюме:

  • Если вы хотите добавить путь (например /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