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

17

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

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

В /etc/profileфайле, как говорится в следующем комментарии "system-wide .profile file for the Bourne shell". Означает ли это, что файлы профиля являются основными файлами конфигурации для bash?

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

PATH="$HOME/bin:$PATH"

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

Может кто-то опытный, пожалуйста, дать широкое и подробное объяснение PATHпеременной? Благодарность!

Ларри Лоулесс
источник

Ответы:

20

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

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

В системах, использующих 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, но это зависит от диспетчера отображения, от среды рабочего стола или другого сценария запуска сеанса и от того, как каждый дистрибутив настроил их.

Жиль "ТАК - перестань быть злым"
источник
4

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

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

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

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

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

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

Клаату фон Шлакер
источник
Я только что проверил все те файлы, которые вы упомянули, однако ~ / .bash_profile и .cshrc не существуют. 3 файла сценария в каталоге /etc/profile.d: appmenu-qt5.sh, bash_completion.sh & vte.sh также не устанавливают переменную PATH. Что вы имеете в виду, говоря, что «оболочка имеет переменные окружения» - это значение PATH по умолчанию, установленное в двоичной программе / bin / bash? Когда я выводю echo $ PATH, я получаю: / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games но я понятия не имею, где все это происходит на самом деле.
Ларри Лоулесс
Я думаю, что я несколько неправильно понял ваш вопрос, я думал, что вы спрашиваете обо всех местах, которые может быть установлен PATH, но я думаю, что вас больше интересует, где изначально установлен PATH . Для этого посмотрите на /etc/bashrc. Это определяет, как запускается BASH, который должен включать все начальные переменные среды. В моей системе /etc/bashrcчитает из, /etc/profile.dно звучит так, будто у вас всего 3 файла, /etc/profile.dпоэтому ваш дистрибутив может делать это по-другому.
Клаату фон Шлакер
1
Я в основном хочу знать все тонкости этого. Я хотел бы, чтобы Кен Томпсон был моим отцом :)
Ларри Лоулесс
Вы получите там. Поверьте, после того, как вы некоторое время используете этот материал каждый день, все это начинает впитываться, и до тех пор, пока вы продолжаете спрашивать «почему?» и читая документы для ответов, вы в конечном итоге многому научитесь!
Клаату фон Шлакер
В Linux Mint 18 Cinnamon обязательно проверьте /etc/profile.d/jdk_home.sh. Я переименовал этот файл в jdk_home.sh.old, и теперь мой путь не переопределяется, и я могу вызвать java -version и увидеть Java 9 как ожидается. Несмотря на то, что я правильно выбрал Java 9 в альтернативных обновлениях --config java, этот файл jdk_home.sh по-прежнему переопределял $ PATH
flyingdrifter
3

Чтобы добавить к другим ответам:

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

Владимир Пантелеев
источник