Вопрос или проблема
Я читал в нескольких местах, что 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
-
Системные файлы конфигурации
/etc/profile
: Это общий файл конфигурации для оболочек, основанных на Bourne, включая bash. Он может быть использован для установки значений переменных окружения для всех пользователей на системе. Однако не всегда в этом файле явно указывается значениеPATH
./etc/profile.d/
: В этом каталоге могут находиться дополнительные скрипты, которые загружаются при входе в систему. Администраторы могут использовать эти скрипты для установки переменнойPATH
в зависимости от особенностей системы./etc/environment
: Этот файл используется PAM (Pluggable Authentication Modules) для установки переменных среды. В отличие отprofile
, он не поддерживает синтаксис оболочки и используется только для простого назначения переменных.
-
Локальные файлы конфигурации
~/.profile
: Это файл, который выполняется при входе пользователя в систему. В нем можно дополнительно установить или изменить переменнуюPATH
. Например, строкаPATH="$HOME/bin:$PATH"
добавляет пользовательский каталогbin
в начало переменнойPATH
, обеспечивая доступ к пользовательским скриптам и программам.~/.bash_profile
,~/.bash_login
: Эти файлы специфичны для bash и могут использоваться для инициализации переменных окружения, включаяPATH
, если доступен~/.bash_profile
, то именно он будет использован; если нет, то будет проверен~/.bash_login
, и только потом~/.profile
.
-
Стандартные значения по умолчанию
- Если переменная
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=' ~
.