2011-08-17 19:36:41 +0000 2011-08-17 19:36:41 +0000
86
86

Как установить переменную PATH на компьютере Mac, чтобы инструменты, установленные в Hombrew-инсталляции, были найдены?

Пытаюсь установить Homebrew на новый Mac (на предыдущих Mac я бы устанавливал пакеты из исходников).

Первым пакетом, который я пытался установить, был Git:

$ brew install git

Установка прошла нормально, но which git всё ещё показывает тот /usr/bin/git, который пришёл вместе с Lion (я думаю?). И не тот /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!?!

Итак, что я сделал не так?

Ответы (9)

79
79
79
2013-01-13 22:35:02 +0000

Я нашел эту должность очень полезной. Вместо того, чтобы изменять переменную $PATH, вы просто редактируете свой файл /etc/paths. Homebrew хочет, чтобы я изменил свой PATH; понятия не имею, как

Как только я последовал инструкциям и поставил /usr/local/bin выше /usr/bin, мои проблемы были решены.

  1. В операционной системе X откройте терминал
  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 over в месте Переполнения стека для его ответа там.

29
29
29
2013-04-09 23:28:21 +0000

Этот ответ устарел. Раньше предпочитали Homebrew PATH, как было объяснено, но это уже не так. Тем не менее, этот подход является более универсальным, так что ради интереса, я оставляю его.


Не стоит.

Homebrew намеренно держит /usr/local/bin after /usr/bin в пути для максимальной совместимости. Изменение порядка следования этих каталогов в PATH путем редактирования /etc/paths будет означать, что all программы в любом месте системы, независимо от того, как они были запущены, получат версию команды Homebrew. Но некоторые могут специально ожидать версию Apple, или просто не иметь возможности использовать более новую версию, и т.д.

Как сохранить этот принцип и все равно получить Homebrew-инсталлированную версию git? Как говорится, все проблемы могут быть решены с помощью слоя индендирекции (за исключением наличия слишком большого количества слоев индендирекции). - Или в этом случае, как оказалось, два слоя.

Конкретно, это было частью моих привычек в Unix, иметь каталог ~/bin, который я поставил в начале моего PATH. Это один из первых битов в моем каталоге .bashrc:

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

Это проверяет, содержит ли PATH, и если нет, то готовит ли он. После этого, выборочно делая только ~/bin, управляемый на Homebrew, имеет приоритет над системной версией (вместо двоичного файла every, управляемого на Homebrew), и только для ваших сеансов командной оболочки (вместо программ all, начинающихся откуда угодно, включая программы с графическим интерфейсом), это так же просто, как и симлинковать его:

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

Вы could можете напрямую соединить git, но тогда вам придется исправлять вашу сим-ссылку каждый раз, когда вы делали /usr/local/Cellar/git/1.8.2.1/bin/git (прямо или косвенно). С помощью symlink с фиксированным местоположением Homebrew вам не нужно будет беспокоиться об этом.

Таким образом, вы добавляете каталог к вашей brew upgrade git, чтобы вы могли добавить его в вашу $HOME, чтобы вы могли создать симлинк на симлинк, и это исправит вашу проблему и поместит улыбку на Dr Seuss. Yo dawg I herd you like symlinks so we put a path in your PATH so you can symlink while you symlink.

18
18
18
2011-08-17 19:42:55 +0000

Вы не сделали ничего плохого, но кажется довольно ясным, что если бы у вас на пути было /usr/local/bin до /usr/bin, то эта конкретная проблема исчезла бы. Самое простое исправление - это сделать это и поместить что-то вроде

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

в ваш ~/.bash_profile, чтобы все, что Homebrew установил, было найдено первым. Так я установил его на свой Mac, и он работал для меня так долго, однако, YMMV.

Похоже, что они верят, что он будет работать с /usr/local/bin будучи after /usr/bin, так что, хотя я, возможно, испортил мои собственные $PATH, я вижу, где не хватает их документации:

Обратите внимание, что вы должны поставить /usr/local/bin после /usr/bin, потому что некоторые программы ожидают получить системную версию, например, ruby, и сломаться, если они получат новую версию Homebrew.

Из Discrepancy between wiki & brew doctor #10738 .  Обратите внимание, что в этом документе далее говорится: “The FAQ (цитата выше) относится к настройке PATH для приложений с графическим интерфейсом; доктор (совет по установке /usr/local/bin впереди /usr/binв вашем PATH) относится к настройке PATH для приложений CLI”.

6
6
6
2013-04-03 19:28:03 +0000

Я не согласен с ответом Джомаса. Редактирование файла /etc/paths изменит пути загрузки для всех программ. Это может быть опасно, если системное приложение ожидает найти определенную версию двоичного файла, но найдет другую версию, потому что вы отредактировали файл путей. Вместо этого измените переменную пути в ~/.bashrc (или ~/.bash_profile). Тогда ваш путь загрузки изменится только внутри терминала:

Добавьте приложение на домашнем языке в PATH

экспортируйте PATH=/path/to/homebrew/app/bin:$PATH

Затем перезагрузите bash или source ~/.bashrc, и все готово к работе. Так как путь к homebrew идет раньше, чем что-либо другое, bash загрузит версию, которую вы загрузили с помощью homebrew.

5
5
5
2014-01-03 22:07:43 +0000

Насколько я понимаю, 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 содержит “g”, так что, например, чтобы выполнить 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 должным образом, на самом деле, в последний раз, когда я проверял (это было на прошлой неделе), они не обрабатывались вообще. Это большая проблема, и чтобы ее полностью избежать, вместе с сопутствующей проблемой конфигурации страницы man, которая тегируется вместе с установкой $PATH правильно, я поставлю инструменты, связанные с OSX, особенно те, которые находятся в /bin и /usr/bin, в первую очередь.

Другой причиной, по которой я вообще не ставлю /usr/local/bin, является то, что brew плохо играет с другими, а fink и port (MacPorts) в настоящее время имеют гораздо больше поддерживаемых пакетов, которые мне нужны NOW. Например, я могу получить 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 проблемы!

4
4
4
2014-09-18 20:46:55 +0000

Здесь куча хороших ответов. Вот мой:

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
2
2
2013-07-30 18:47:40 +0000

Вместо того, чтобы вообще путаться с PATH (который в моей истории возвращается, чтобы сжечь меня месяцы спустя), я добавил псевдоним для git'а в каталог пользовательских псевдонимов zsh (~/.zshrc/custom/git_alias.zsh).

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

0
0
0
2017-05-23 17:29:13 +0000

Вы можете выпустить следующую команду в терминале, она добавит домашний каталог напитка + /bin в PATH вашего любого SHELL “rc” init файла (bash, zsh, csh)

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

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

0
0
0
2014-03-21 11:54:36 +0000

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

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

Похожие вопросы

19
12
5
13
6