81

Попытка установить 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 ответов9

74

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

Доморощенный хочет, чтобы я исправил мой ПУТЬ; понятия не имею, как

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

  1. На OS 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 в графическом текстовом редакторе и отредактировать его таким образом.

Благодарим Фэнда из Stack Overflow за его ответ.

28

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


Ты не должен.

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

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

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

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

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

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

Вы можете напрямую использовать символическую ссылку /usr/local/Cellar/git/1.8.2.1/bin/git , но тогда вам придется исправлять символическую ссылку каждый раз, когда вы выполняете brew upgrade git (прямо или косвенно). Используя символическую ссылку на фиксированный адрес Homebrew, вы не должны беспокоиться об этом.

Таким образом, вы добавляете каталог в ваш $HOME чтобы вы могли добавить его в свой PATH чтобы вы могли использовать символическую ссылку на символическую ссылку, и это решает вашу проблему и вызывает улыбку у доктора Сьюса. Да, черт возьми, мне нравятся символические ссылки, поэтому мы указываем путь к вашей PATH чтобы вы могли использовать символические ссылки во время символической ссылки.

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, и сломаться, если они получат более новую версию Homebrew.

Из несоответствия между вики и пивоваренным доктором # 10738.  Обратите внимание, что в этом документе говорится:«FAQ (приведенная выше цитата) относится к настройке PATH для приложений с графическим интерфейсом; врач (совет ставить /usr/local/bin перед /usr/bin в вашей PATH) ссылается на к настройке PATH для приложений CLI. "

6

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

# Добавить доморощенное приложение в PATH
экспортировать PATH =/ путь / к / homebrew / app / bin:$ PATH

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

5

Насколько я понимаю, brew не помещает в /usr/local/bin ничего, что могло бы противоречить (имеет то же имя, что и) распределенный исполняемый файл Apple. Следовательно, наличие /usr/local/bin в пути до /bin и /usr/bin не должно быть проблемой, потому что не должно быть конфликтов имен. * Однако посмотрите на проблемы с ls и tar и другими агрегаторами пакетов, такими как fink и port (MacPorts), ниже.

Brew делает одну из двух известных мне вещей, которые помогают управлять конфликтами имен:

  1. Brew оставленные несвязанными кеги в погребе. Для установки вещи brew оставляет инструменты там, где они есть, и создает символические ссылки на эти инструменты в /usr/local/bin . Для инструментов, с которыми brew не хочет столкновения имен, он не создает символическую ссылку.
  2. Для многих, если не для всех стандартных инструментов, которые также находятся в /bin и /usr/bin , brew префикс ссылки в /usr/local/bin на "g", например, для выполнения ls с версией brew , используйте 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) в настоящее время имеют гораздо больше поддерживаемых пакетов, которые мне нужны СЕЙЧАС. Например, я могу получить 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

Здесь есть множество хороших ответов. Вот мой:

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 custom aliases (~/.zshrc/custom/git_alias.zsh).

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

0

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

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

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

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

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

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