Як слід встановити змінну PATH на моєму Mac, щоб знайдені інструменти, встановлені Hombrew?


86

Намагаюся налаштувати Homebrew на новий Mac (на попередніх Macs я встановив би пакунки з джерела).

Перший пакет, який я спробував встановити, був Git:

$ brew install git

Установка пройшла нормально, але which gitвсе ще показує той, /usr/bin/gitщо прийшов разом з Левом (я думаю?). І не той, /usr/local/bin/gitщо був щойно встановлений.

$ echo $PATH
/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@rails31/bin:/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/meltemi/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/michael/.rvm/bin:/usr/local/mysql/bin:/opt/subversion/bin:/Developer/Additions/checker/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

Як ви бачите /usr/binза замовчуванням раніше /usr/local/binв$PATH

Отже, я розгублений! Я подумав, що суть HomeBrew (а те, чим здається, творці вихваляються ) у тому, що вам не доведеться возитися зі $PATHзмінною!?!

Отже, що я зробив не так?


Ви раніше возилися зі своїм шляхом і, можливо, не впорядковували їх? Крім того, я не впевнений, чому це "нахвальна точка" форми домашньої кави ... це не подобається поняття шляху або його модифікація - це складна річ, яка включає в себе написання та посипання 10 різних списків у вашій системі спеціальними дозволами чи іншим .. ..
блудникина

1
шлях, ну та частина, яка не пов'язана з RVM, повинна бути стандартною проблемою. І ні, я не скаржуюся на те, що потрібно змінювати шлях. Просто вони, схоже, повторюють твердження, If you choose /usr/local, everything 'just works!'що мені доводиться дивуватися, чого я пропускаю ... тому що це не просто працює.
Мелтемi

Відповіді:


78

Я вважаю, що ця пов’язана публікація дуже корисна. Замість зміни $PATHзмінної, ви просто відредагуйте /etc/pathsфайл.

Homebrew хоче, щоб я змінив свою PATH; немає поняття як

Як тільки я дотримувався вказівок і ставив /usr/local/binвище /usr/bin, мої проблеми були вирішені.

  1. У OS X відкрийте Terminal
  2. Введіть команду: sudo vi /etc/paths
  3. Введіть свій пароль, якщо вас вимагають
  4. Ви побачите список шляхів. Відредагуйте їх так, щоб /usr/local/binшлях був введений вище /usr/binшляху
  5. * Збережіть та закрийте
  6. Перезапустіть термінал

Ось як виглядає моя після того, як я це зробив:

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

* Щоб зберегти та закрити, введіть двокрапку ( :), потім введіть wq(одночасно писати та вийти), після чого Enter.

Ви також можете відкрити /etc/pathsфайл у графічному текстовому редакторі та відредагувати його таким чином.

Кредит fengd над на переповнення стека для його відповіді там.


Для vi dimwits (як я) використовуйте d, щоб скоротити рядок, а p - вставити його, коли в командному режимі
Джерард,

10
Я б з цим насторожився - краща відповідь - просто змінити шлях у .profile / .bash_profile та експортувати його туди. Змінюючи / etc / paths, ви (потенційно) впливаєте на всі системні процеси; зміна PATH у .profile / .bash_profile локалізує перевагу як для вашого облікового запису, так і для тих команд, які викликаються через командну оболонку (що, на мій випадок, для розробки - те, що я хочу). Якщо ви дійсно обережні, можете зробити те, що пропонує @Aristotel Pagaltzis у відповіді нижче.
rholmes

1
Чи є якийсь момент, коли ви перестаєте вважати, що є щось жахливо неправильне, що проста установка від менеджера пакунків, призначений для OSX, не працює? Зміна вашого шляху - це потенційно неполадка "виправити" і BTW, тому я натрапив на це запропоноване виправлення, - це те, що варіння не вдалося оновити мій шлях, але "шляху" вже в правильному порядку. Ще один тупик. Зупиніть безумство, виправте першопричину.
Rick O'Shea

Також є path_helperі є /etc/paths.d.
Саймон Райт

29

Ця відповідь застаріла. Уподобане PATHзамовлення на домашньому перекладі було, як пояснено, але це вже не відповідає дійсності. Однак підхід більш загальноприйнятний, тому заради інтересів я його залишаю.


Ви не повинні.

Homebrew навмисно тримає /usr/local/bin після /usr/bin в шляху для максимальної сумісності. Повернення порядку в цих каталогах PATHшляхом редагування /etc/pathsозначало б, що всі програми в будь-якій точці системи, незалежно від того, як вони були запущені, отримають версію Homebrew команди. Але деякі можуть спеціально очікувати версії Apple, або просто не матимуть можливості використовувати новішу версію тощо.

Як зберегти цей принцип і все-таки отримати версію програми Homebrew git? Як говориться, всі проблеми можна вирішити за допомогою шару непрямості (за винятком занадто багато шарів непрямості). - Або в цьому випадку, як виявляється, два шари.

Зокрема, це було частиною моїх звичок Unix - мати ~/binкаталог, який я поставив на початку свого PATH. Це один із перших бітів у моєму .bashrc:

[[ :$PATH: == *:$HOME/bin:* ]] || PATH=$HOME/bin:$PATH

Це перевіряє, чи PATHмістить ~/bin, а якщо ні, попередньо попередньо. При цьому на місці вибіркового вибору лише керованого Homebrew gitмає перевагу над системною версією (замість кожного бінарного керованого Homebrew), а також лише перед сеансами оболонки (замість усіх програм, запущених з будь-якого місця, включаючи програми GUI). настільки ж просто, як символізувати його:

ln -s /usr/local/bin/git ~/bin/git

Ви можете/usr/local/Cellar/git/1.8.2.1/bin/git безпосередньо посилатись на символьне посилання , але тоді вам доведеться виправляти своє посилання кожен раз, коли ви це робили brew upgrade git(прямо чи опосередковано). Посилаючись на симпосилання з фіксованим розташуванням Homebrew, вам не доведеться турбуватися про це.

Таким чином, ви додаєте до себе каталог, щоб $HOMEви могли додати його, PATHщоб ви могли посилатися на симпосилання, і це вирішить вашу проблему і покладе посмішку на доктора Сеуса. Yo dawg Я стадо вам подобається посилання, тому ми покладемо шлях у ваш, PATHщоб ви могли посилатись, поки ви посилаєтесь.


1
Чудово, це відповідає саме тому, що мені було цікаво!
N_A

Цей SEEMS любить правильну відповідь, але я не можу з’ясувати точні команди для виконання. Я продовжую отримувати "Файл існує" під час створення символьних посилань.
Райан

Недостатньо деталей, щоб допомогти вам, вибачте.
Арістотель Пагальціс

1
@Ryan переконайтеся, що у вас є порядок аргументів прямо в lnкоманді. Перший шлях - ціль, а другий
симпосилання

1
правда, що на el cap, я не зміг із застарілою відповіддю і мені вдалося (я використовую ZSH) відредагувати порядок шляху в. zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs

17

Ви нічого поганого не зробили, але здається досить зрозумілим, що якби ви були /usr/local/binна своєму шляху до /usr/binтого, як ця конкретна проблема пішла б. Найпростіший виправлення - зробити саме це і поставити щось подібне

export PATH=/usr/local/bin:$PATH

у вашому ~/.bash_profileтому все, що встановлюється Homebrew, знайдено першим. Ось так я встановив його на своєму Mac, і він працював на мене так довго, проте, YMMV.

Здається, вони вірять, що це буде працювати з тим, що /usr/local/binбуде після /usr/bin , тому, хоч я, можливо, приглушив своє $PATH, я можу побачити, де не вистачає їх документації:

Зауважте, що вам слід це поставити /usr/local/binпісля того, /usr/bin як деякі програми очікують отримання системної версії, наприклад, ruby ​​та break, якщо вони отримають нову версію Homebrew.

Від розбіжності між wiki & brew doctor # 10738 . Зверніть увагу , що цей документ продовжує говорити, «Довідку (вище цитата) відноситься до PATH для настройки графічного інтерфейсу додатків, лікар (рада поставити /usr/local/binпопереду /usr/bin в вашому PATH) відноситься до PATH для установки CLI додатків.»


1
Невже це не залишить /usr/local/binу мене двох с $PATH? Я так думаю. Цікаво, чи нам замість цього слід редагувати порядок шляхів за замовчуванням у /etc/pathsабо вміст /etc/paths.d? Але це вплине на кожного користувача ... можливо, це не погано. У всякому разі, просто хотілося подивитися, як інші люди до цього підійшли.
Мелтемi

@Meltemi, дух цієї відповіді правильний: оновіть своє PATH(в обраному вами порядку), щоб /usr/local/binпередувати /usr/bin. Я особисто оновити PATHін , .bash_profileяк запропоновано тут.

@ Nick - цікава інформація ... і служить лише для заплутування питань (принаймні моїх питань) ... Документи Homebrew, мабуть, означають, що команди Terminal повинні підбирати програми, /usr/local/binнавіть якщо це простежується /usr/binшляхом. Але GUI-додаткам потрібна спеціальна обробка? Здавалося б, всі програми, GUI чи ні, потребують нас, щоб відрегулювати змінну $ PATH. Отже, чого мені (або творцям домівки) не вистачає?
Мелтемi

Я думаю, що Homebrew передбачає, що ви хочете спершу використати виконуваний файл Apple - git - це зміна, оскільки до Lion він не постачався Apple, тому Homebrew знадобився - тепер ви можете використовувати Apple,
user151019

Я з цим погоджуюся з Марком. Для MacPorts і Fink, припущення полягало в тому, щоб забезпечити абсолютно незаймане, окреме середовище від усього, що Apple постачає з коробки. Homebrew висловив позицію, що речі Apple чудові і не уникати його використання (навіщо завантажувати іншу версію gcc, коли Apple, швидше за все, зробить це?).
Нік Клауер

6

Я не згоден з відповіддю jthomas. Редагування файлу / etc / paths змінить шляхи завантаження для всіх програм. Це може бути небезпечно, якщо системна програма очікує знайти конкретну версію бінарного файлу, але знайде іншу версію, оскільки ви відредагували файл своїх шляхів. Натомість змініть змінну шляху у ~ / .bashrc (або ~ / .bash_profile). Тоді ваш навантажувальний шлях зміниться лише всередині терміналу:

# Додати додаток для домашнього перекладу до
експорту PATH = / path / to / homebrew / app / bin: $ PATH

Потім перезавантажте bash або source ~/.bashrc, і ви добре підете. Оскільки шлях до домашнього перекладу передує іншому, bash завантажить версію, яку ви завантажили з homebrew.


В OS X .bashrcвоно не завантажується за замовчуванням. Ви вручну це джерело?
slhck

О так. Я приїхав з OS X з Ubuntu і звик мати його, .bashrcтому я його джерело від свого .bash_profile. Якщо ви не хочете створювати файл rc, ви можете додати команду до свого .bash_profile.
Натан

5

Як я розумію, brewнічого не вкладає в /usr/local/binте, що стикається (має те саме ім’я, як), який розповсюджується виконуваним Apple. Тому перехід /usr/local/binдо цього шляху /binі /usr/binне повинен бути проблемою, оскільки не повинно бути зіткнень з іменами. * Тим НЕ менше, побачити проблеми з lsі tar, а також з використанням інших агрегаторів пакетів , як finkі port(MacPorts), значно нижче.

Brew робить одну з двох речей, які мені відомі, що допомагають керувати зіткненнями імен:

  1. Brewзалишає незв’язані кеги в льоху. Щоб встановити речі, варити залишає інструменти там, де вони є, і створює символічні посилання на ці інструменти в /usr/local/bin. Для інструментів, які brewне хочуть зіткнення імені, він не створює символічне посилання.
  2. Для багатьох , якщо не все стандартних інструментів , які також /binі /usr/bin, brewпрефікси посилання в /usr/local/binс «г», так, наприклад, щоб виконати lsз версією заварний, використання gls. Просто робити ls -lпо прибуттю /usr/local/binі шукати посилання на файли - це ті , brewпоставлені там. Примітка. brewВстановлені інструменти, до яких потрібно отримати доступ до їх справжніх імен, знаходяться в /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Я не ставлю /usr/local/binна свій шлях з двох причин - ці причини знаходяться внизу моєї відповіді.

Щоб оцінити зіткнення імен у вашій системі, використовуйте brew doctorі шукайте цей розділ - Ось результат brew doctor, що цікавить:

Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:

    ctags
    emacs
    emacsclient
    etags
    ex
    git
    git-cvsserver
    git-receive-pack
    git-shell
    git-upload-archive
    git-upload-pack
    rview
    rvim
    view
    vim
    vimdiff
    vimtutor
    xxd

Consider setting your PATH so that /usr/local/bin
occurs before /usr/bin. Here is a one-liner:
    echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile

Причиною я не ставлю brewінструменти спочатку, насправді, зовсім не так, це те, що brewвстановлені lsта tarкоманди не обробляють файлову систему ACL належним чином, насправді востаннє я перевіряв (що було минулого тижня), вони були ' t взагалі не впорався . Це велика проблема, і щоб уникнути її взагалі, разом із пов’язаною manпроблемою з конфігурацією сторінки, яка позначає теги разом із $PATHправильним налаштуванням , я переконуюсь, що я поклав спочатку OSXвідповідні інструменти, особливо ті, які знайдені у /binта /usr/bin, спочатку.

Ще одна причина, яку я взагалі не ставлю /usr/local/binна свій шлях, полягає в тому, що brewвона не грає добре з іншими, finkі port(MacPorts) в даний час набагато більше підтримуваних пакетів, які мені потрібні ЗАРАЗ . Наприклад, я можу отримати gnome-terminalз цим fink, але було б докласти великих зусиль, щоб побудувати формулу і зробити те ж саме brew. Отже, я зберігаю /swі /optшукаю $PATH( finkі port, відповідно,) та довідникові речі, які мені потрібні /usr/local/bin, в тому числі gnat, або прописано, або я використовую bash alias, або я створюю setupфайл для зовсім іншого середовища, коли пишу Adaкод.

Вся справа в тому, що це дійсно залежить від того, що ти хочеш і потребуєш на той час.

Ось приклад проблеми ACL, про який я згадував вище.

За допомогою стандартних OSXінструментів:

$ /bin/ls -le /var/root | head -7
total 24
drwx------+  3 root  wheel  102 May 28  2013 Desktop
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit
drwx------+  6 root  wheel  204 Sep 19 14:22 Documents
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit

та із brewвстановленими інструментами:

$ /usr/local/bin/gls -le /var/root
/usr/local/bin/gls: invalid option -- 'e'
Try '/usr/local/bin/gls --help' for more information.

і

$ /usr/local/bin/gls --help | grep -i acl

Ви отримаєте подібні результати, tarі я не знаю вдома багато інших brewінструментів, але хто може дозволити собі щось перервати через 6 місяців через ACLпроблему!


Дякуємо за корисну інформацію. Однак, як примітка, у моїй системі зараз у мене є виконавчі файли з тим самим іменем як / usr / bin та / usr / local / bin (наприклад, git, який символізує, як ви зазначаєте). Отже, вони за замовчуванням конфліктують. Я також хочу змінити системні інструменти для моєї оболонки.
ролмс

4

Тут є цілий ряд хороших відповідей. Ось моя:

echo >> ~/.bashrc alias my="PATH=/usr/local/bin:$PATH"
. ~/.bashrc
my git --version # Brew's fancy git
git --version # Apple's old crusty git

Економить вам необхідність створити окремий псевдонім для кожної програми, а в якості бонусу він залишає доступні установки за замовчуванням у випадку, якщо вони вам потрібні.

Працює так само, якщо ви використовуєте ZSH; просто вимкніть bashrcдля zshrc. Ви можете переключитися з myза _або навіть @заощадити на друку.


2

Замість того, щоб взагалі возитися з PATH (що в моїй історії повертається, щоб спалити мене місяцями пізніше), я додав псевдонім для git у свою спеціальну каталог псевдонімів zsh (~ / .zshrc / custom / git_alias.zsh).

alias git='/usr/local/bin/git'


0

Я вважаю за краще обмеження змін змінними оточення, як $PATHдля користувачів, які насправді хочуть змін. Таким чином, я просто додаю наступне до ~/.bashrc:

export PATH="$(brew --prefix)/bin:$PATH"

0

Ви можете випустити наступну команду в терміналі, вона додасть домашній каталог brew + / bin в PATH вашого init файлу SHELL "rc" (bash, zsh, csh)

echo "export PATH="'$PATH:$(brew --prefix)/bin' >> ~/.$(basename $SHELL)rc

Насолоджуйтесь!

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