Есть проблема с наличием / usr / local / bin перед / usr / bin на пути в OS X? - PullRequest
70 голосов
/ 19 марта 2011

По умолчанию OS X 10.6 использует /usr/libexec/path_helper для добавления следующих путей, перечисленных в файле /etc/paths:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Это означает, что /usr/bin предшествует /usr/local/bin на пути. Это приводит к тому, что версия git, установленная Xcode 4 в /usr/bin, будет вызываться вместо версии, установленной Homebrew в /usr/local/bin.

Что приводит меня к моему вопросу, есть ли проблема с тем, что /usr/local/bin предшествует /usr/bin на пути? Есть ли конкретная причина, по которой Apple по умолчанию /usr/bin предшествует /usr/local/bin?

Как изменить порядок /usr/bin и /usr/local/bin

Это проблема перемещения /usr/local/bin из нижней части файла /etc/paths в верхнюю часть? Это может повлиять на путь не только при запуске терминала, поскольку /usr/libexec/path_helper может использоваться другими ресурсами (я не уверен в этом).

Хотя избыточно, мне кажется безопаснее добавить /usr/local/bin к пути в ~/.bash_profile, что будет означать, что /usr/local/bin будет на пути дважды.

Ответы [ 5 ]

27 голосов
/ 19 марта 2011

Нет и нет. Они просто странные ... локальные по определению должны переопределять.

3 голосов
/ 15 февраля 2013

У меня возникла проблема с той же проблемой, и я нашел ссылку ниже от Google.

https://discussions.apple.com/thread/3588837?start=0&tstart=0

Они сказали, что изменение / etc / paths не являетсяхорошая идея по соображениям безопасности.

2 голосов
/ 23 января 2014

Я просто хотел бы добавить, что если вы хотите, чтобы ваш PATH оставался чистым (без повторяющихся записей), вы можете добавить следующее в ваш .bash_profile для достижения желаемого эффекта:

# remove /usr/local/bin and /usr/bin
export PATH=`echo ":$PATH:" | sed -e "s#:/usr/local/bin:#:#g" -e "s/^://" -e "s/:$//"`
export PATH=`echo ":$PATH:" | sed -e "s#:/usr/bin:#:#g" -e "s/^://" -e "s/:$//"`
# add /usr/local/bin and /usr/bin in that order
export PATH="/usr/local/bin:/usr/bin:$PATH"

Я узнал этот маленький трюк от http://ntk.me/2013/05/04/path-environment-variable/

Редактировать: очень важно! Не получайте приказ, что они удалены неправильно! Если вы это сделаете, sed не будет работать, и у вас останется /usr/local/bin:/usr/bin: в качестве вашей PATH!

Стоит также отметить, что другие, предположившие, что это может создать некоторые проблемы с безопасностью, являются правильными. Пожалуйста, убедитесь, что понимаете все риски!

2 голосов
/ 23 февраля 2013

Я нашел все вышеперечисленное полезным, особенно предупреждение @ Ohgyun Ahn . Поэтому я предлагаю компромисс, который я только что реализовал:

Изменить /etc/paths или /private/etc/paths (как в OS X 10.8) и переопределить только git . Это позволяет избежать любых последствий для безопасности (в любом случае не связанных с git) при реализации современного git для использования всеми программами, которые фактически проверяют общесистемный путь.

  1. Создайте новый каталог для использования в переопределении, например /usr/local/git-override/
  2. Создание новых символических ссылок от git-override к git-программам homebrew. Просто переделайте символические ссылки git из /usr/local/bin.
  3. добавить /usr/local/git-override к вершине (/private)/etc/paths.

Надеюсь, это поможет кому-то еще.

1 голос
/ 17 апреля 2014

Поскольку изменение порядка /etc/paths швов не рекомендуется для стабильности и безопасности системы ... вот мое решение, основанное на ответе @ vmrob

read PATH < <(echo "$PATH" | sed  \
    -e 's/^/:/' -e 's/$/:/'       \
    -e 's_:/usr/local/bin:_:_g'   \
    -e 's_:/usr/local/sbin:_:_g'  \
    -e "s_:/usr/bin:/bin:_:$HOME/bin:/usr/local/bin:/usr/bin:/bin:_"        \
    -e "s_:/usr/sbin:/sbin:_:$HOME/sbin:/usr/local/sbin:/usr/sbin:/sbin:_"  \
    -e 's/^://' -e 's/:$//')
export PATH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...