Как Mac OS X устанавливает значение $ PATH?

11

У меня есть общее представление о том, как можно установить $ PATH, но есть ли документация, которая полностью описывает, где Mac OS получает все пути, которые добавляются к $ PATH? Я знаю о таких вещах, как /etc/profile, /etc/pathsи /etc/profile.d, но есть ли другие сценарии, которые в конечном итоге влияют на значение $ PATH? Я также не очень хорошо знаком между не-логином и оболочкой ( .bashrc- .bash_profile), но я знаю об основных различиях.

Психо Панч
источник

Ответы:

9

Обычно ваш PATH устанавливается оболочкой. Для Bash все объясняется в руководстве . Вы также можете открыть man bashи перейти к INVOCATIONчасти.

Вызывается как интерактивная оболочка входа или с --login

Когда Bash вызывается как интерактивная оболочка для входа или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения.

Вызывается как интерактивная оболочка без авторизации

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, Bash читает и выполняет команды из ~ / .bashrc, если этот файл существует. В OS X, кроме того, есть, path_helperкоторый читает содержимое /etc/paths.dи добавляет их к вашему пути.

Ключевым моментом здесь является то, что в OS X Терминал открывает оболочку входа по умолчанию, в то время как в Linux оболочки обычно запускаются как оболочки без входа в систему. У Джоша Стейгера есть хорошее объяснение того, как входить в систему и не входить в систему .

Итак, по сути, есть только эти два три, где вы можете установить пути:

  • /etc/profile(который звонит path_helper)
  • /etc/pathsи /etc/paths.d(вызывается с path_helper)
  • ваш файл конфигурации оболочки ( .bash_profile)
slhck
источник
Спасибо за лаконичный и информативный ответ. Так что я думаю, что понимаю, какие сценарии / артефакты влияют на $ PATH. Значит ли это, что /etc/profileскрипт в основном используется bash? У меня нет опыта работы с другими оболочками, но я предполагаю, что они следуют другой структуре?
Психо Панч
/etc/profileИспользуется большинством (все? Не 100% уверен) оболочек. Вот почему это хороший выбор, чтобы поместить вещи, которые вы хотите везде, например, PATH. Bash читает .bash_файлы, в то время как Zsh, например, читает .zshrcв дополнение к другим. Это зависит от оболочки.
Slhck
«Кроме того, в OS X есть path_helper, который читает содержимое файла /etc/paths.d и добавляет его к вашему пути». Нет, неpath_helper вызывается для интерактивных не входящих в систему оболочек (и неинтерактивных оболочек). На самом деле он вызывается для интерактивных оболочек входа в систему . /etc/profile
Мэггеро
8

Пути в /etc/pathsи , /etc/paths.d/*как правило , добавляют к PATHпо path_helper . path_helperзапускается из /etc/profile, поэтому он запускается, когда bash вызывается как интерактивная оболочка входа в систему, но не когда bash вызывается как оболочка без входа в систему или неинтерактивная оболочка.

/etc/pathsсодержит /usr/local/binв конце по умолчанию, и /etc/paths.d/по умолчанию пусто.

Terminal и iTerm 2 по умолчанию открывают новые оболочки в качестве оболочек входа в систему, и оболочка, открываемая при подключении к компьютеру по ssh, также является оболочкой входа в систему. Многие эмуляторы терминалов на других платформах tmuxи режим оболочки в Emacs открывают новые оболочки как оболочки без входа в систему.

Я добавил эту строку в /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Это меняет значение PATHкорневого процесса launchd. Значение наследуется всеми другими процессами, включая процессы запуска на уровне пользователя. Вы можете применить изменения /etc/launchd.conf, перезапустив или запустив launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confи перезапустив процессы.

На OS X ~/.profileне читается, когда вы входите в систему графически. Если и то ~/.bash_profileи другое ~/.profileсуществует, bash тоже не читает ~/.profile.

~/.MacOSX/environment.plist перестал работать в 10.8.

LRI
источник