Ответ 1
Нет, и нет. Они просто странные... локальные по определению должны переопределять.
По умолчанию 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
будет на пути дважды.
Нет, и нет. Они просто странные... локальные по определению должны переопределять.
У меня была проблема с той же проблемой, и я нашел ссылку ниже от googling.
https://discussions.apple.com/thread/3588837?start=0&tstart=0
Они сказали, что изменение /etc/paths не является хорошей идеей по соображениям безопасности.
Я нашел все вышеприведенное полезное, особенно предупреждение @Ohgyun Ahn. Поэтому я предлагаю компромисс, который я только что реализовал:
Изменить /etc/paths
или /private/etc/paths
(как в OS X 10.8) и переопределить только git. Это предотвращает любые последствия для безопасности (без привязки к git, во всяком случае) при внедрении обновленного git для использования всеми программами, которые действительно проверяют общесистемный путь.
/usr/local/git-override/
/usr/local/bin
./usr/local/git-override
в начало (/private)/etc/paths
.Надеюсь, что это поможет кому-то другому.
Я хотел бы добавить, что если вы хотите, чтобы ваша 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!
Также стоит отметить, что другие, предполагающие, что это может привести к некоторым проблемам безопасности, верны. Обязательно ознакомьтесь с рисками!
Так как модификация порядка /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