10

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

2 ответа2

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)
7

Пути в /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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .