Как именно рассчитывается PATH?

2

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

  1. Как именно рассчитывается PATH для bash?
  2. Как именно это рассчитывается для других оболочек? (Я предполагаю, что его оболочка зависит, но что общего между всеми оболочками?)
  3. Как именно это рассчитывается для приложений с графическим интерфейсом?
  4. Я пропускаю другой способ запуска вещей? Демоны делают что-то другое? (Я так не думаю? Но может быть ...)

Кроме того, я сейчас в Высшей Сьерре, но я вижу, что некоторые люди упоминали, что это изменилось в какой-то момент?

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

Джордж Мауэр
источник
Что вы подразумеваете под фразой «как рассчитывается PATH ?». Это переменная среды, которая установлена
Аллан
@ Аллан, да, но как именно это установить? Это не только .bash_profileдля примера, потому что к тому времени, когда он запускается, в PATH уже есть что-то (поэтому мы добавляем его вперед или назад). Он рассчитывается с учетом некоторой последовательности источников и выполнения некоторой последовательности сценариев, но что это такое ?
Джордж Мауэр
1
Я голосую, чтобы закрыть этот вопрос как слишком широкий. Пожалуйста, измените вопрос, чтобы ограничить его конкретной проблемой с достаточным количеством деталей, чтобы найти адекватный ответ. Старайтесь не задавать несколько разных вопросов одновременно.
user3439894
@ user3439894 Вы бы порекомендовали задать каждый из них как отдельный вопрос? Потому что кажется, что это будет огромное количество совпадений, и некоторые ответы, вероятно, будут идентичны.
Джордж Мауэр
Это действительно очень широкий вопрос. Но вот несколько указателей: bash и другие оболочки в стиле Борна, а также csh и связанные с ними оболочки будут использовать path_helperдля установки переменной PATH. Проверьте его страницу руководства; Вы найдете, что они читают /etc/pathsи /etc/paths.d/*для содержания. Пользователям других оболочек рекомендуется адаптировать этот метод; таким образом, все оболочки получают одинаковый путь.
Харальд Ханче-Олсен

Ответы:

6

Я собираюсь объединить 1 и 2, потому что все оболочки читают файлы при запуске.

PATH наследуется от родительского процесса. Это ключевая концепция, которую вам нужно понять.

Сначала PATH жестко запрограммирован в ядре:

sysctl user.cs_path
user.cs_path: /usr/bin:/bin:/usr/sbin:/sbin

launchd, который действует как initможет быть настроен для изменения этого PATH. Вообще это не изменилось.

Loginwindow.app настроит среду при входе в ваш компьютер. PATH проверит, что он установлен или будет задан жестко закодированный путь в ядре или измененный путь, заданный launchd. Это похоже на вызов loginwindow.app login -pf <username>.

На этом этапе пользователь LaunchAgent или LaunchDaemon может изменить PATH.

Это будет ПУТЬ, доступная для приложений с графическим интерфейсом из Finder. (Ранние версии OS X могли использовать ~ / .MacOSX / environment.plist для изменения PATH для приложений с графическим интерфейсом). Теперь, если это кажется сложным, это не так и, скорее всего, как и я, доступный путь PATH/usr/bin:/bin:/usr/sbin:/sbin

Когда вы запускаете Terminal.app, он сначала вызывает login(login -pf), который запускает вашу оболочку как оболочку входа. Соответствующие файлы в / etc и вашей папке HOME читаются. Теперь PATH должен отличаться от установленного в loginwindow.app. Помните, мы говорили о наследовании? Если вы запустите приложение с графическим интерфейсом пользователя из сеанса терминала, тогда доступный для приложения GUI путь будет таким же, как установленный оболочкой.

Что касается демонов, они обычно начинаются по их абсолютному пути.

fd0
источник
Спасибо за frigign, объясняющий, как launchd вписывается во все это! Никто не мог сказать мне!
Джордж Мауэр
Запущенный это просто еще один процесс и работает как все остальные. Он наследует среду и устанавливает среду для процессов, которые он разветвляет.
Марк
4

Со страницы руководства для PATH ( man path):

Путь поиска команд. Это разделенный двоеточиями список каталогов, в которых оболочка ищет команды (см. ИСПОЛЬЗОВАНИЕ КОМАНДЫ ниже) .... Путь по умолчанию зависит от системы и устанавливается администратором, устанавливающим bash. Распространенным значением является `` / usr / gnu / bin: / usr / local / bin: / usr / ucb: / bin: / usr / bin ''.

Итак, из этого, за исключением справочной страницы bash, мы видим, что путь bash (изначально):

  • зависит от системы и не зависит от оболочки
  • устанавливается тем, кто установил bash (в данном случае Apple)
  • имеет значение по умолчанию

Путь можно (очевидно) изменить. Существует несколько мест, где можно установить переменную среды PATH:

  • ~/.bashrc
  • ~/.bash_profile

В macOS файл /etc/pathsиспользуется для настройки путей поиска:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Кроме того, путь изначально настраивается /usr/libexec/path_helperутилитой, которая будет создавать путь на основе содержимого/etc/paths.d

Вызывается, из /etc/profileкоторого устанавливается общесистемный профиль bash (индивидуальные задаются ~/.profile)

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

Разные снаряды

Каждый из оболочек имеет свой профиль всей системы (как и bash), который устанавливает начальный PATH (вызывая path_helperутилиту)

  • Зш = /etc/zprilfe
  • Кш = /etc/profile
  • Csh = /etc/csh.login
Аллан
источник
Да, но не все запускается через bash, верно? Если я запускаю eshell в emacs или korn shell, то он не пройдет через тот же процесс. Я понимаю, что она будет отличаться для каждой оболочки, но она совершенно другая или ОС предоставляет «общую базу инициализации»? А как насчет приложений, запущенных в центре внимания? Как рассчитывается ПУТЬ, которую они видят?
Джордж Мауэр
Терминология важна - путь не рассчитан. Это установлено. Ты путаешь ОС с оболочкой. Оболочка - это не что иное, как среда для выполнения команд в ОС.
Аллан
Честно, Аллан, я не уверен, какой еще термин использовать. Путь действительно задан (с точки зрения сценариев), но с точки зрения приложения, которое может использовать PATH, был выполнен ряд шагов для создания текущей переменной env PATH. Что касается приложений с графическим интерфейсом пользователя, то, что вы не используете PATH, отличается от того, что он недоступен. Вы можете сделать system attribute PATHили что-то в AppleScript, верно? Значение, которое я вижу там ... откуда оно? Какую серию шагов прошла ОС, чтобы установить ее?
Джордж Мауэр
1
Это звучит все больше и больше, как будто у вас есть проблема XY . В чем проблема, с которой вы сталкиваетесь, потому что AppleScript не нужно устанавливать путь оболочки.
Аллан
1
Вот почему он помечен (у меня нет) как слишком широкий. Первое, на что я хотел бы обратить ваше внимание, это справочное руководство по Bash, которое даст вам хороший пример того, как работает этот материал.
Аллан
0

Все: Пожалуйста, поймите, что Apple со временем изменила парадигму Paths в Sierra (см. Https://lluad.com/blog/os-x-system-path/ ), HighSierra и Mojave. Path_helper теперь работает по-другому, кажется, потому что он заблокировал окна терминала для меня, что я могу освободить и работает нормально, комментируя

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
#  fi

в /etc/profile.

У меня есть сценарии, которые исправляют путь, потому что у меня работает несколько инструментов (ядро из них установлено Homebrew, но это только около 15 из 25, которые я использую каждый день), и их нужно настроить для использования в .app приложения, в сценариях запуска .sh и для автозапуска в защищенной последовательности загрузки под Mojave. Это сбивает с толку, но Мохаве наверняка изменил требуемую структуру, и мне нужно усилить ее самостоятельно.

Что это означает для этого конкретного вопроса, так это то, что этот вопрос важен во всей его широте и что на него должны ответить разработчики, которые почувствовали боль и зафиксировали свои системы для Мохаве, а также пришли из различных «миров», как обычные IDE. , XCode, Eclipse, Bean, Intellij и т. Д. Кроме того, те, кто зависят от доморощенных стеков, или стеки mamp, и т. Д. И для тех, кто занимается докером, .node, vm и т. Д., Работают и другие более глубокие инструменты. По мере того, как Apple внедряет большую безопасность, наши вещи ломаются, но я рад, что Apple выполняет свою работу. Мы должны сделать наше, поэтому нам нужны передовые люди, чтобы передать новую мудрость. Статьи, которым 6 и более месяцев, просто смущают нас.

Деннис
источник
Почему-то это не отвечает на вопрос, заданный выше. Если ответ находится на странице, на которую вы ссылаетесь, пожалуйста, кратко изложите его в своем сообщении (и, возможно, укоротите последующие абзацы). Кроме того, не только упомяните, что вы делаете вещи по-другому, но также объясните / покажите, как вы это делаете.
холме