$ PATH сводит меня с ума

10

Хорошо, извиняюсь, если это что-то глупое, но у меня заканчиваются идеи.

Цель: предварять /usr/local/binв$PATH

Проблема: $PATH не буду делать то, что я хочу или ожидаю

Как я попал сюда: я хочу начать учиться программировать, поэтому мне становится удобно бездельничать, но у меня нет большого опыта. Я установил fishоболочку (потому что она дружественная!) И использовал homebrewее как оболочку по умолчанию (ниже system prefs>users & groups>advanced). В какой-то момент я побежал brew doctorпосмотреть, все ли мои установки были кошерными, и он предложил мне перейти /usr/local/binк началу, $PATHчтобы я мог использовать свою установку, gitа не системную копию. Хорошо - но между path_helperи fish, что-то происходило с $PATHэтим, было вне моего контроля, и я никогда не мог правильно расставить пути.

Окружающая среда: OSX 10.8.2, повышен с 10.7ish, с xcodeи установлен DevTools, плюс x11, homebrewиfish

Более подробная информация: Я настроил мои оболочки пользователя по умолчанию обратно в bash, и попробовал различные снаряды через terminal.app- bash, fish, sh. Я перешел /usr/local/binна вершину, /etc/pathsно это ничего не изменило. Я просмотрел различные config.fishфайлы и закомментировал то, что может связываться с $ PATH, не помогло. У меня есть следующие файлы в /etc/paths.d/:

./10-homebrew содержащий /usr/local/bin

./20-fish содержащий /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz содержащий /opt/X11/bin

Я добавил set +xк своему, profileи когда я начинаю, terminal.appя получаю:

Last login: Mon Oct  1 13:31:06 on ttys000
+ '[' -x /usr/libexec/path_helper ']'
+ eval '/usr/libexec/path_helper -s'
++ /usr/libexec/path_helper -s PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/fish/1.23.1/bin:/opt/X11/bin";
export PATH;
+ '[' /bin/bash '!=' no ']'
+ '[' -r /etc/bashrc ']'
+ . /etc/bashrc
++ '[' -z '\s-\v\$ ' ']'
++ PS1='\h:\W \u\$ '
++ shopt -s checkwinsize
++ '[' Apple_Terminal == Apple_Terminal ']'
++ '[' -z '' ']'
++ PROMPT_COMMAND='update_terminal_cwd; '
++ update_terminal_cwd
++ local 'SEARCH= '
++ local REPLACE=%20
++ local PWD_URL=file://Chriss-iMac.local/Users/c4
++ printf '\e]7;%s\a' file://Chriss-iMac.local/Users/c4 
Chriss-iMac:~ c4$

Похоже, что path_helper работает, но затем запускает echo $PATHменя /usr/bin:/bin:/usr/sbin:/sbin. Так что, похоже, path_helperдаже не делает то, что должен?

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

Chris4d
источник
обратите внимание, я могу заставить его работать fish, создавая ~/.config/fish/config.fishс помощью, set PATH /usr/local/bin $PATHно у меня все еще есть проблема, по- path_helperвидимому, не работать, как следует, и, $PATHследовательно, неполный. Также все еще есть проблема различных $PATHсценариев, приложений, запускаемых из графического интерфейса и т. Д.
Chris4d

Ответы:

5

решение:

выберите, хотите ли вы общесистемную настройку или пользовательскую конфигурацию и отредактируйте соответствующий файл конфигурации, не используйте path_helper с fish.

Больше

У fish нет исходного кода / etc / profile, для системной и пользовательской конфигурации он будет читать /etc/fish/config.fish и ~ / .config / fish / config.fish соответственно [1].

path_helper предназначен для использования для оболочек, которые являются источником общесистемного файла профиля (sh, csh и их производные). Так как 10.7 path_helper, кажется, соблюдает порядок в / etc / paths, AFAIR этого не сделал в 10.6, и с этим было сложнее справиться.

Если вы действительно хотите использовать path_helper с fish, вам нужно проанализировать его вывод, поскольку он будет предоставлять только синтаксис sh и csh с опциями -s и -c .

Что-то типа

/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g'

должен сделать работу:

[1] http://ridiculousfish.com/shell/user_doc/html/index.html#initialization

anddam
источник
Большой! Вот что у меня сейчас: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- отлично работает здесь с fish 2 и Mac OS 10.8.3
topskip
3

Я абсолютно не имею представления о /etc/paths.d, path_helper и т. Д., Которые кажутся мне чрезмерными осложнениями, но следующее в конце вашего ~ / .bashrc должно вас исправить:

 PATH=/usr/local/bin:$PATH

Надеюсь это поможет!

Аарон Миллер
источник
Спасибо Aaron - path_helperэто OSX-специфическая утилита, которая предположительно устанавливается $PATHпри входе в систему, читая /etc/pathsи затем /etc/paths.d/*. В любом случае, я понимаю, что ваше предложение должно исправить меня bash, но я действительно хочу, чтобы оно работало fish(и последовательно по всей системе, если это не слишком много, чтобы ожидать).
Chris4d
Ах - извините за это. Я сам не пользователь OS X, больше жаль, но из-за небольшого избиения Google это выглядит так, как будто этот вопрос переполнения стека может больше походить на то, что вы ищете - но опять же, я не Сам пользователь OS X, и ответил только потому, что быстрый (читай: небрежный) взгляд на ваш вопрос заставил меня подумать, что вы заинтересованы только в bash, поэтому примите мой совет здесь с несколькими зернами соли. Надеюсь, это все равно поможет
Аарон Миллер
3

Спасибо Аарону за ответы и за всех тех, кто ответил на другие подобные вопросы на сайтах stackexchange. Ради потомков, вот что я понял:

  1. path_helperвызывается из /etc/profileсинтаксиса eval '/usr/libexec/path_helper -s'(где апострофы на самом деле являются обратными чертами). Как манекен, я не знал, как работают обратные кавычки, и почему-то изменил их на кавычки. Это сломало мою profileот загрузки path_helper. Заменены галочки и теперь все работает как надо (конечно).
  2. Использование set PATH /usr/local/bin $PATHв моем ~/.config/fish/profile.fishгарантирует, что я получаю правильный порядок в моей предпочитаемой оболочке, но пока path_helperон работает, он может быть избыточным.
  3. Для обеспечения того , чтобы полная $PATHдоступна скриптов, GUI приложений и т.д., это , кажется, жеребьевка между launchd.confи environment.plist... до сих пор исследования , что один.
Chris4d
источник
1
На днях я прочитал (но я не помню источник), что 10.8 больше не предлагает верный способ получить путь, видимый для всех приложений. Я помню, в частности, что environment.plist больше не читается; Я смутно осведомлен о launchd.conf, так что это может сработать, но я думаю, что в статье предлагается, что это не будет.
Эхристоферсон
1
дальнейшее наблюдение: это не похоже на то, что path_helper вообще работает в рыбах; он выводит синтаксис csh или bash, оба из которых несовместимы. Вместо этого вы можете использовать ~ / .config / fish / config.fish (сценарий запуска fish) для cat /etc/paths.d/* и добавить их в $ PATH. Надеюсь, что это помогает кому-то!
Chris4d
ты вообще читал мой ответ? это было там за четыре месяца до вашего последующего наблюдения
anddam