$ 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це навіть не робить того, що належить?

Я впевнений, що тут є якась чітко визначена поведінка, яку я не розумію, або я щось зламався, намагаючись виправити це. Будь ласка, допоможіть!


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

Відповіді:


5

рішення:

виберіть, чи хочете ви налаштувати загальну систему або конфігурацію користувача та відредагуйте відповідний файл конфігурації, не використовуйте path_helper з рибами.

більше

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 з рибою, вам потрібно буде проаналізувати його вихід, оскільки він надасть лише синтаксис 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


Чудово! Ось що я зараз маю: 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, & c., Все це здається мені надмірними ускладненнями, але наступне в кінці вашого ~ / .bashrc повинно поставити вас правильно:

 PATH=/usr/local/bin:$PATH

Сподіваюся, це допомагає!


Спасибі Aaron - path_helperце специфічна для OSX утиліта, яка нібито встановлюється $PATHпри вході в систему, читаючи з того /etc/pathsчасу /etc/paths.d/*. Так чи інакше, я розумію, що ваша пропозиція повинна мене виправити bash, але я насправді хочу, щоб вона працювала fish(і послідовно по всій системі, якщо цього не надто очікувати).
Chris4d

Ах - вибачте з цього приводу. Я сам не користувач OS X, шкода більше, але, зважаючи на те, що Google базується, це виглядає так, ніби це запитання щодо переповнення стека може бути більше схожим на те, що ви шукаєте - це знову сказало, що я не Користувач OS X сам відповів, тому що швидкий (прочитаний: недбалий) погляд на ваше запитання змусив мене подумати, що вас цікавить лише баш, тому прийміть тут мою пораду з кількома зернами солі. Сподіваюсь, це допоможе, все-таки -
Аарон Міллер

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доступний для сценаріїв, додатків графічного інтерфейсу тощо, виявляється, що це перетворення між launchd.confта environment.plist... все ще досліджує це.

1
Я нещодавно прочитав (але не пам’ятаю джерела), що 10.8 більше не пропонує надійний спосіб отримати шлях, видимий для всіх додатків. Зокрема, я пам’ятаю, що Environment.plist вже не читається; Я нечітко знаю, що запускається.conf, так що це може спрацювати, але я думаю, що стаття запропонувала, що це не буде.
echristopherson

1
більше подальших заходів: це не схоже на те, що path_helper взагалі працює в рибі; він видає синтаксис csh або bash, обидва вони несумісні. Натомість ви можете використовувати ~ / .config / fish / config.fish (сценарій запуску риби) для cat /etc/paths.d/* та додати їх до $ PATH. Сподіваюся, що хтось допомагає!
Chris4d

ти навіть читав мою відповідь? він був там з чотирьох місяців до вашого подальшого спостереження
іаддам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.