Пытаюсь настроитьДомашнее пивона новом Mac (на предыдущих Mac я бы устанавливал пакеты из исходников).
Первый пакет, который я попытался установить, был 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
переменной!?!
Так что же я сделал не так?
решение1
Я нашел этот связанный пост очень полезным. Вместо того, чтобы менять переменную $PATH
, вам просто нужно отредактировать /etc/paths
файл.
Homebrew хочет, чтобы я изменил свой PATH; понятия не имею, как
/usr/local/bin
Как только я выполнил все вышеизложенные указания /usr/bin
, мои проблемы были решены.
- В OS X откройте Терминал.
- Введите команду:
sudo vi /etc/paths
- Введите свой пароль, если вас попросят его ввести.
- Вы увидите список путей. Отредактируйте их так, чтобы
/usr/local/bin
путь был введен над/usr/bin
путем - *Сохранить и выйти
- Перезапустить терминал
Вот как выглядит мой результат после того, как я это сделал:
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
*Чтобы сохранить и выйти, введите двоеточие ( :
), затем введите wq
(чтобы писать и выйти одновременно), а затем Enter.
Вы также можете открыть /etc/paths
файл в графическом текстовом редакторе и редактировать его там.
Кредит дляфэнгд на Stack Overflow, где есть его ответ.
решение2
Этот ответ устарел. Предпочтительный PATH
порядок Homebrew раньше был таким, как объяснено, но теперь это не так. Однако этот подход более применим, поэтому ради интереса я его оставляю.
Не стоит этого делать.
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-managed git
приоритетным над системной версией (вместокаждыйуправляемый 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
чтобы вы могли создавать символические ссылки, пока вы создаете символические ссылки.
решение3
Вы не сделали ничего плохого, но кажется довольно очевидным, что если бы вы имели /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.
ОтНесоответствие между вики и brew doctor #10738. Обратите внимание, что далее в этом документе говорится: «Часто задаваемые вопросы (приведенная выше цитата) относятся к настройке PATH для приложений с графическим интерфейсом пользователя; доктор (совет поместить /usr/local/bin
впереди /usr/bin
в PATH) относится к настройке PATH для приложений с командной строкой интерфейса пользователя».
решение4
Насколько я понимаю, brew
не помещает ничего, /usr/local/bin
что конфликтует (имеет то же имя, что и) с исполняемым файлом, распространяемым Apple. Поэтому наличие /usr/local/bin
в пути перед /bin
и /usr/bin
не должно быть проблемой, поскольку не должно быть никаких конфликтов имен. *Однако см. проблемы с ls
и tar
, а также использование других агрегаторов пакетов, таких как fink
и port
(MacPorts), ниже.
Brew
выполняет одну из двух известных мне вещей, помогающих управлять конфликтами имен:
Brew
оставляет в Подвале несвязанные бочки. Чтобы установить что-то, brew оставляет инструменты там, где они есть, и создает символические ссылки на эти инструменты в/usr/local/bin
. Для инструментов,brew
с которыми не требуется конфликта имен, он не создает символическую ссылку.- Для многих, если не для всех стандартных инструментов, которые также есть в
/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
Другая причина, по которой я вообще не добавляю свой path, заключается в том, что brew
он плохо работает с другими, и fink
( port
MacPorts) в настоящее время поддерживают гораздо больше пакетов, чем мне нужно.СЕЙЧАС. Например, я могу получить gnome-terminal
с fink
, но это будет большой труд, чтобы построить формулу и сделать то же самое с brew
. Поэтому я сохраняю /sw
и /opt
в своем поиске $PATH
(для fink
и port
, соответственно) и ссылаюсь на то, что мне нужно из /usr/local/bin
, включая gnat
, либо прописными буквами, либо использую bash
alias
's, либо ищу 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
проблемы!