Полное представление о том, где переменная PATH устанавливается в bash

Вопрос или проблема

Я читал в нескольких местах, что PATH устанавливается в /etc/profile или в файле .profile, который находится в домашнем каталоге.

Это единственные места, где устанавливается путь? Я хочу лучше это понять.

В файле /etc/profile есть комментарий: "глобальный .profile файл для оболочки Bourne". Это означает, что файлы профиля являются основными конфигурационными файлами для bash?

В этом файле я вообще не вижу, чтобы переменная PATH устанавливалась. В файле .profile в домашнем каталоге есть такая строка:

PATH="$HOME/bin:$PATH"

Судя по всему, это сбрасывает PATH, потому что оно конкатенирует уже установленную строку $PATH с $HOME/bin:, верно? Но если /etc/profile и ~/.profile — это единственные файлы, устанавливающие PATH, откуда берется $PATH в этой строке кода, если он не определен в /etc/profile?

Не могли бы кто-то опытный дать обширное и детальное объяснение переменной PATH? Спасибо!

Существует множество мест, где можно установить PATH.

Программа login устанавливает его на значение по умолчанию. Как настраивается это значение по умолчанию, зависит от системы. В большинстве встраиваемых систем Linux оно берется из /etc/login.defs, с разными значениями для root и для других пользователей. Обратитесь к справочнику login(1) на вашей системе, чтобы узнать, что она делает.

На системах, использующих systemd, значение по умолчанию для PATH зашито в коде.

На системах, использующих PAM, в частности модуль pam_env, переменные окружения могут быть установлены в глобальном файле /etc/environment и в пользовательском файле ~/.pam_environment.

Затем большинство способов входа в систему (но не cron-задачи) выполняет оболочку входа, которая читает глобальные и пользовательские конфигурационные файлы. Эти файлы могут изменять значение PATH, обычно для добавления записей, но иногда и другими способами. Какие файлы читаются, зависит от того, какая оболочка используется. Оболочки стиля Bourne/POSIX читают /etc/profile и ~/.profile. Bash читает /etc/profile, но для пользовательского файла читает только первый существующий файл из ~/.bash_profile, ~/.bash_login и ~/.profile. Zsh читает /etc/zshenv, ~/.zshenv, /etc/zprofile, ~/.zprofile, /etc/zlogin и ~/.zlogin. Многие графические сеансы организуют загрузку /etc/profile и ~/.profile, но это зависит от дисплейного менеджера, рабочей среды или другого скрипта запуска сеанса и от того, как каждая дистрибутивная система это настроила.

Начальная переменная PATH обычно устанавливается в /etc/profile. Иногда системный администратор также может добавить переменные PATH для загрузки в /etc/profile.d.

Это системные переменные PATH, которые по умолчанию наследуются всеми, кто входит в систему (если не переопределены локально). Обычно это устанавливает очевидные пути, такие как /usr/bin, хотя на моей работе мы широко используем /opt и несколько пользовательских мест, поэтому они также устанавливаются там.

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

Для входов, специфичных для оболочки, PATH может быть определен в ~/.bash_profile, ~/.bashrc или .cshrc и аналогичных. Пользователи могут установить PATH здесь, если хотят конкретные пути для конкретных оболочек, или если они просто поддерживают все свои личные настройки там.

В кратце: /etc/profile и /etc/profile.d традиционно являются каскадными настройками; они наследуются и обычно добавляются в личные dot-файлы (хотя пользователь может выбрать их переопределить). Личные dot-файлы обычно устанавливаются пользователем.

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

В дополнение к другим ответам:

bash установит PATH на зашитое значение по умолчанию, если оно не установлено в окружении. На машине с Ubuntu Server 16.04.2 я получаю:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Мы можем проверить, что это значение действительно зашито в коде, а не считывается из окружения или какого-то файла, используя утилиту strings:

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

Однако я получаю другой результат на своем Arch Linux:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

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

Вещи, которые я не вижу:

  • X вещи
  • Мастеркопии, откуда .profile и т.д. копируются при создании аккаунта
  • pam_env
  • Недавняя тема на Debian, где это обсуждается в некоторой степени.

Что касается Кена Томпсона, вы можете быть удивлены его: “Мнениями о Linux”.

https://askubuntu.com/questions/705912/where-is-my-path-variable-being-set

^^ Это помогло мне. Попробуйте поискать ‘PATH=’ или ‘export PATH=’ вместо фактического каталога, чтобы увидеть, где он устанавливается.

Ответ или решение

Полное понимание переменной PATH в bash

Переменная окружения PATH играет ключевую роль в системах UNIX/Linux, определяя, где система ищет исполняемые файлы команд. Это позволяет пользователю запускать программы, не вводя их полные пути. Однако, вопрос о том, где именно устанавливается PATH, может вызывать путаницу. Давайте разберем все аспекты, связанные с установкой переменной PATH в bash.

Места установки переменной PATH

  1. Системные файлы конфигурации

    • /etc/profile: Это общий файл конфигурации для оболочек, основанных на Bourne, включая bash. Он может быть использован для установки значений переменных окружения для всех пользователей на системе. Однако не всегда в этом файле явно указывается значение PATH.
    • /etc/profile.d/: В этом каталоге могут находиться дополнительные скрипты, которые загружаются при входе в систему. Администраторы могут использовать эти скрипты для установки переменной PATH в зависимости от особенностей системы.
    • /etc/environment: Этот файл используется PAM (Pluggable Authentication Modules) для установки переменных среды. В отличие от profile, он не поддерживает синтаксис оболочки и используется только для простого назначения переменных.
  2. Локальные файлы конфигурации

    • ~/.profile: Это файл, который выполняется при входе пользователя в систему. В нем можно дополнительно установить или изменить переменную PATH. Например, строка PATH="$HOME/bin:$PATH" добавляет пользовательский каталог bin в начало переменной PATH, обеспечивая доступ к пользовательским скриптам и программам.
    • ~/.bash_profile, ~/.bash_login: Эти файлы специфичны для bash и могут использоваться для инициализации переменных окружения, включая PATH, если доступен ~/.bash_profile, то именно он будет использован; если нет, то будет проверен ~/.bash_login, и только потом ~/.profile.
  3. Стандартные значения по умолчанию

    • Если переменная PATH не задана, bash присваивает ей значения по умолчанию, которые могут различаться в зависимости от дистрибутива Linux. Например, в Ubuntu эти пути могут включать,
      /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. Для проверки значения по умолчанию можно выполнить команду env -i bash -c 'echo $PATH'.

Взаимодействие файлов конфигурации

  • Когда вы входите в систему, сначала устанавливаются значения из системных файлов, затем из пользовательских файлов конфигураций. Пользователь может переопределить системные настройки, добавляя свои параметры в ~/.profile или ~/.bash_profile.
  • Фактически, PATH может дополняться через множество файлов, что позволяет пользователю и системному администратору настраивать окружение в соответствии с их потребностями и требованиями безопасности.

Заключение

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

Если вы хотите больше узнать о конфигурации среды, имеет смысл просмотреть файлы, упомянутые выше, и проверить команды для отладки, например, grep -r 'PATH=' ~.

Оцените материал
Добавить комментарий

Капча загружается...