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

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

Пытаюсь настроитьДомашнее пивона новом 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, мои проблемы были решены.

  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, где есть его ответ.

решение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выполняет одну из двух известных мне вещей, помогающих управлять конфликтами имен:

  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Другая причина, по которой я вообще не добавляю свой path, заключается в том, что brewон плохо работает с другими, и fink( portMacPorts) в настоящее время поддерживают гораздо больше пакетов, чем мне нужно.СЕЙЧАС. Например, я могу получить 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проблемы!

Связанный контент