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

По умолчанию 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 будет на пути дважды.

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Я хотел бы добавить, что если вы хотите, чтобы ваша 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!

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

Ответ 5

Так как модификация порядка /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