5

Недавно я начал настраивать среду OSX 10.7 для разработки. Я установил HomeBrew и добавил следующее в мой .bash_profile:

export PATH="/usr/local/bin:/usr/local/sbin:~/bin:$PATH"        

Все работает отлично, за исключением того, что когда я получаю echo $PATH я получаю следующую строку дубликатов:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:usr/local/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

Чтобы сделать его более читабельным, это все пути:

/usr/local/bin
/usr/local/sbin
~/bin:/usr/local/bin
/usr/local/sbin
~/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
usr/local/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/local/git/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/usr/X11/bin

Я не думаю, что я внес какие-либо изменения в путь, кроме одной строки в моем .bash_profile . Каков наилучший способ для меня спарить эти дубликаты? Есть ли способ выследить, какие файлы изменяют мой путь, и попытаться устранить их?

4 ответа4

3

Сделав мой комментарий, вот несколько советов по сокращению $PATH .

Если посмотреть на ваш путь, кажется, что .bash_profile выполняется дважды, или изменение, внесенное в .bash_profile , дублируется в другом месте.

Есть 7 дубликатов дополнений '/usr/local/git/bin' и 'use/local/bin' [sic], за которыми следуют еще 5 копий /usr/local/git/bin. В зависимости от того, как установлен git , вы можете запросить у менеджера пакетов, какие файлы были установлены с помощью git ; Там могут быть некоторые файлы конфигурации или модифицированные системные файлы, которые влияют на PATH .

Поместите set -x в самый верх вашего .bash_login , затем запустите новую оболочку входа в систему. Вы должны получить много выходных данных, которые точно показывают, что bash делает при запуске, что должно помочь вам определить, где изменяется PATH . Вы можете удалить set -x только разберетесь или сдадитесь. Если вы ничего не нашли, вы также можете добавить это в начало /etc/profile чтобы отследить, что система делает до обработки вашего собственного .bash_profile .

2

Я добавил это в свой $ HOME/.bashrc (вы также можете добавить его в .bash_profile, если хотите), чтобы удалить повторяющиеся записи из $ PATH. Я тестировал только на Linux, но также должен работать на Mac. Он должен быть добавлен после первоначального экспорта PATH.

export PATH=$(echo $PATH | awk -F: '
{ for (i = 1; i <= NF; i++) arr[$i]; }
END { for (i in arr) printf "%s:" , i; printf "\n"; } ')
1

Я запустил сценарий Райана Томпсона из командной строки.
Он удалил все дубликаты для меня, не меняя порядок и не оставляя в конце :

PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"

В дополнение к удобному 1-строчковому описанию выше, Райан делится (более структурированным) скриптом, который он использует в своей config чтобы дедуплицировать другие переменные и PATH .

(См. Его пост Unix & Linux для более подробной информации)

0

Установка git изменила ваш .bash_profile без серьезной предварительной проверки. Этот установщик повредил его (видимо, 12 раз). Используйте receipe предложенного сыпи, но только один раз , чтобы определить правильный минимальный PATH , чтобы включить обратно в .bash_profile

Вам не нужно инициализировать свой PATH в вашем .bashrc . Этот сценарий инициализации зарезервирован для конфигурации, которая должна меняться с каждым уровнем оболочки, например, приглашение, позиция, цвет, но не PATH.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .