Де встановлюється $ 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.
Sathyajith Bhat

@Sathya, мені здається, /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для деяких людей це не працює. У зміні шляху для 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

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

Швидкий приклад зробити це в один крок:

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

В іншому випадку ви можете просто перейти до /etc/paths.d і вкласти файл туди безпосередньо. У будь-якому випадку будь-які частини шляху у файлах у цьому каталозі будуть додані до шляху за замовчуванням.

Це також працює для manpath.

Ось посилання на більш детальну інформацію:

ars technica: як я можу щось додати до PATH у сніговому леопарді?

Щодо другої примітки: MacPorts вводить все в каталог opt саме через те, що воно не використовується матеріалами Apple. Таким чином він не конфліктуватиме. Їх посібник (чудово написаний, BTW) містить пояснення, чому він використовує опцію та як змінити цей замовчування, якщо хочете.

Посібник MacPorts


Дуже круто. Тепер нам залишається лише отримати ті програми, які залежать від шляху, щоб більше не забруднювати наші файли профілів ...
Даніель Бек

Любіть це. Просто!
Andrew Hedges

коментар від 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.
Sathyajith Bhat

Єдиний рядок, без додавання до файлів та простого видалення. Люблю це. Спасибі leanne
Ibrahim Lawal

4

Щоб показати свій шлях, відлучіть $ PATH.

echo $PATH

Щоб встановити свій шлях, відредагуйте ~/.bash_profile, а не ~/.bash_login.


3

Існує також шлях, визначений ssh .

Порівняйте echo $PATHз ssh localhost 'echo $PATH'. Оскільки ssh не читає / etc / profile, / usr / libexec / path_helper не запускається, і таким чином / etc / path пропускається. Тепер спробуйте 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

1

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

Також /optКаталог зазвичай створюється MacPorts і він зберігає свої файли в цій папці.


1

Що стосується документів на /usr/libexec/path_helperкорисність, початкові компоненти для $ PATH були взяті /etc/pathsі за замовчуванням виглядають так

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

для OS-X Snow Leopard

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.