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


86

Попытка установить 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переменной!?!

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


вы раньше связывались с вашим путем и, возможно, поставили их в неправильном порядке? Также я не уверен, почему это «точка хвастовства» формы доморощенного ... это не похоже на концепцию пути или его изменение - это сложная вещь, которая включает в себя создание и распространение 10 различных списков по всей вашей системе со специальными разрешениями или чем-то еще .. ..
prodigitalson

1
путь, хорошо та часть, которая не связана с RVM, должна быть стандартной проблемой. И нет, я не жалуюсь на необходимость изменить путь. Просто они, кажется, повторяют утверждение, If you choose /usr/local, everything 'just works!'что я должен задаться вопросом, что мне не хватает ... потому что это не "просто работает".
Мелтеми

Ответы:


78

Я нашел этот пост очень полезным. Вместо того, чтобы менять $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файл в графическом текстовом редакторе и редактировать его таким образом.

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


Для vi dimwits (как и я) используйте d, чтобы вырезать строку, и p, чтобы вставить ее в командном режиме
Gerard

10
Я бы с осторожностью отнесся к этому - лучший ответ - просто изменить путь в .profile / .bash_profile и экспортировать его туда. Изменяя / etc / paths, вы (потенциально) влияете на все системные процессы; изменение PATH в .profile / .bash_profile локализует предпочтения как для вашей учетной записи, так и для тех команд, которые вызываются через командную оболочку (что, в моем случае для разработки, - это то, что я хочу). Если вы действительно осторожны, вы можете сделать то, что @Aristotle Pagaltzis предлагает в ответе ниже.
Rholmes

1
Есть ли какой-то момент, когда вы перестаете думать, что есть что-то ужасно неправильное, что простая установка из диспетчера пакетов, разработанного для OSX, дает сбой из коробки? Изменение вашего пути - потенциально опасное «исправление», и кстати, причина, по которой я наткнулся на это предлагаемое исправление, заключается в том, что brew также не удается обновить мой путь, но «пути» уже находятся в правильном порядке. Еще один тупик. Остановите безумие, устраните причину.
Рик О'Ши

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

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ссылки, поэтому мы указываем путь к ним, чтобы вы могли использовать символические ссылки во время символической ссылки.


1
Отлично, это отвечает именно то, что мне было интересно!
N_A

Это выглядит как правильный ответ, но я не могу понять точные команды для запуска. Я продолжаю получать «Файл существует» при создании символических ссылок.
Райан

Извините, недостаточно подробностей, чтобы помочь вам.
Аристотель Пагальцис

1
@ Райан, убедитесь, что у вас есть порядок аргументов в lnкоманде. Первый путь - это цель, а второй - символическая ссылка
Freedom_Ben

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

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


1
Разве это не оставит две /usr/local/binс моей $PATH? Я так считаю. Интересно, должны ли мы вместо этого редактировать порядок путей по умолчанию /etc/pathsили содержимое /etc/paths.d? Но это повлияет на каждого пользователя ... может быть, не плохо. Во всяком случае, просто хотел посмотреть, как другие люди подошли к этому.
Мелтеми

@ Meltemi, дух этого ответа верен: обнови свой PATH(так, как ты выберешь), чтобы он /usr/local/binпредшествовал /usr/bin. Я лично обновить PATHин , .bash_profileкак предложено здесь.

@ Ник - интересная информация ... и служит только для того, чтобы сбить с толку вопросы (по крайней мере, мои вопросы) ... Кажется, документы Homebrew подразумевают, что команды терминала должны подбирать приложения, /usr/local/binдаже если они находятся /usr/binна пути. Но приложения с графическим интерфейсом нуждаются в особой поддержке? Казалось бы, все приложения, с графическим интерфейсом или без, нуждаются в том, чтобы мы изменили переменную $ PATH. Так чего же мне (или создателям Homebrew) не хватает?
Мелтеми,

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

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

6

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

# Добавить приложение homebrew в
экспорт PATH PATH = / путь / к / 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оставляет несвязанные кеги в подвале. Чтобы установить материал, 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 файловой системы должным образом. Фактически, в прошлый раз, когда я проверял (что было на прошлой неделе), они не были т вообще . Это БОЛЬШАЯ проблема, и, чтобы избежать ее в целом, наряду с 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, который является символической ссылкой, как вы заметили). Таким образом, они конфликтуют по умолчанию. Я также хочу переопределить системные инструменты для моей работы с оболочкой.
rholmes

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 вашего файла инициализации 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.