
У меня есть базовое понимание того, как можно настроить $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/*
добавляются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. Значение наследуется всеми остальными процессами, включая процессы 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.