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

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

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

решение1

Обычно ваш 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)

решение2

Пути в /etc/pathsи обычно /etc/paths.d/*добавляютсяPATHpath_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. Значение наследуется всеми остальными процессами, включая процессы 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.

Связанный контент