Где $ PATH устанавливается в OS X 10.6 Snow Leopard?

139

Я печатаю echo $PATHв командной строке и получаю

/opt/local/bin:/opt/local/sbin:/Users/andrew/bin:/usr/local/bin:/usr/local/mysql/bin:/usr/local/pear/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin

Мне интересно, где это устанавливается, так как мой .bash_loginфайл пуст.

Я особенно обеспокоен тем, что после установки MacPorts он установил кучу мусора /opt. Я не думаю, что этот каталог существует даже при обычной установке Mac OS X.

Обновление: спасибо jtimberman за исправление моего echo $PATHзаявления

Андрей
источник
5
Комментарий от SMcCandlish :easiest solution when you want to make a site-wide path change (e.g. to include /usr/libexec or whatever) is to edit /etc/paths . While the new /etc/paths.d/ thing is functional, it's actually more hassle than maintaining a single file. As others have hinted but not spelled out, if the path changes you want would be useful only for one user, it's best to make that change in the bash and/or tcsh config files in that user's home directory instead of system-wide.
Сатьяджит Бхат
@ Сатья, мне кажется /etc/paths.dэто полезно для установочных скриптов. Если я хочу, чтобы мой установочный скрипт добавил установленную программу в путь, я могу добавить файл в /etc/paths.d. Если я хочу редактировать путь вручную, /etc/pathsэто лучший вариант.
Haydenmuhl
Я сделал сценарий, основанный главным образом на этом посте, который быстро распечатывает, где определяется PATH в нескольких местах: gist.github.com/lopespm/6407349952bc8a1ff8fb
Педро Лопес

Ответы:

161

При bashзапуске он читает следующие файлы каждый раз, когда вы входите в систему. Для целей OS X это означает каждый раз, когда вы открываете новое Terminalокно.

/etc/profile
~/.bash_profile
~/.bash_login   (if .bash_profile does not exist)
~/.profile      (if .bash_login does not exist)

Когда вы запускаете новую оболочку, набирая bashв командной строке, она читает.bashrc

OS X также использует ~/.MacOSX/environment.plistдля установки большего количества переменных среды, включая пути, если это необходимо.

Наконец, /etc/pathsи /etc/paths.dчитается оболочкой тоже.


/opt/local/binи т.д. добавлены в ~/.tcshrcMacPorts. Также не забудьте заглянуть ~/.cshrc.

Стив Фолли
источник
5
Видимо, ~/.MacOSX/environment.plistне работает для некоторых людей. В Change Path для OS X/etc/paths.d описана альтернатива с использованием папки . Я не проверял это.
Арьян
+1 за ~/.cshrc. Ошеломился, пытаясь понять, почему ~/.profileне работает.
Tomlogic
Я думаю, что этот ответ неполон. Я пытаюсь выяснить, где ошибочный (несуществующий) путь: / usr / bin / local, на который жалуется моя оболочка, и его нет ни в одном из этих файлов.
Томми
Я думаю, что .bashrcчитается независимо от того, печатаете вы bashили нет.
Сяо Пэн - ZenUML.com
48

Посмотрите на файл /etc/paths, который используется /usr/libexec/path_helper, который используется /etc/profile.

Для MacPorts используйте sudo /etc/paths/opt/local/binи снова откройте окно терминала.

Сообщество
источник
25

Серьезно, Leopard дал нам новый способ добавления пути. Просто создайте файл, содержащий часть пути, которую вы хотите добавить, и поместите его в /etc/paths.d

Быстрый пример выполнения этого за один шаг:

echo "/some/path/to/add" >> /etc/paths.d/somefilename

В противном случае вы можете просто перейти в /etc/paths.d и поместить туда файл напрямую. В любом случае любые части пути в файлах в этом каталоге будут добавлены к пути по умолчанию.

Это также работает для manpath.

Вот ссылка на более подробную информацию:

ars technica: как добавить что-то в PATH для снежного барса?

На втором замечании: MacPorts помещает все в каталог opt именно потому, что он не используется в Apple. Таким образом, это не будет конфликтовать. Их руководство (отлично написано, кстати) содержит объяснение того, почему он использует opt и как изменить это значение по умолчанию, если хотите.

Руководство по MacPorts

Лиан
источник
Очень круто. Теперь нам нужно только заставить эти зависимые от пути приложения больше не загрязнять файлы нашего профиля ...
Даниэль Бек
Любить это. Просто!
Эндрю Хеджес
Комментарий от SMcCandlish :I have to concur that there's nothing weird or bad about MacPorts using /opt (likewise Fink uses /sw); trying to replace stock Mac BSD parts with bleeding-edge builds from external projects like these is a recipe for an unusable system that requires an OS reinstallation.
Сатьяджит Бхат
Одна строка, без добавления к файлам и легкое удаление. Люблю это. Спасибо Лайнн
Ибрагим Лавал
4

Чтобы показать свой путь, введите $ PATH.

echo $PATH

Чтобы установить свой путь, редактируйте ~/.bash_profile, а не ~/.bash_login.

jtimberman
источник
3

Также есть путь, определенный ssh .

Сравните echo $PATHс ssh localhost 'echo $PATH'. Так как ssh не читает / etc / profile, / usr / libexec / path_helper не запускается и, следовательно, / etc / paths пропускается. Теперь попробуй ssh localhost 'source /etc/profile; echo $PATH'. Пути должны быть ближе. Остальные различия, вероятно, будут связаны с изменением пути в ваших .bash_profile (который также пропускается ssh) и .bashrc (который читается ssh).

Если вы хотите, чтобы ваш путь ssh был похож на ваш обычный путь к терминалу, вы можете добавить его source /etc/profileв .bashrc.

Кит Бентруп
источник
Спасибо за подсказку! Я искал именно то решение с ssh. svn + ssh не смог найти команду svnserve именно потому, что путь к svnserve был в .profile, но не в .bashrc.
KIR
2

Это может быть определено либо:

  • Системные переменные - /etc/paths
  • Пользовательские переменные - см. Объяснение @Steve Folly
ericn
источник
1

На самом деле он хранится в вашем .profileфайле вместо, .bash_loginи обычно MacPorts будет использовать его вместо .bash_loginфайла.

Также /optкаталог обычно создается MacPorts и хранит свои файлы в этой папке.

ricbax
источник
1

Что касается документации для /usr/libexec/path_helperутилиты, исходные компоненты для $ PATH были взяты из /etc/pathsи по умолчанию выглядит так

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

для OS-X Snow Leopard

AB
источник