$ PATH doprowadza mnie do szału


10

OK, przepraszam, jeśli to coś głupiego, ale brakuje mi pomysłów.

Cel: przyłączyć się /usr/local/bindo$PATH

Problem: $PATH nie zrobię tego, czego chcę lub oczekuję

Jak się tu dostałem: chcę zacząć uczyć się programowania, więc czuję się swobodnie, grzebiąc pod maską, ale nie mam dużego doświadczenia. Zainstalowałem fishpowłokę (ponieważ jest przyjazna!) Za pomocą homebrewi ustawiłem ją jako moją domyślną powłokę (poniżej system prefs>users & groups>advanced). W pewnym momencie pobiegłem, brew doctoraby sprawdzić, czy wszystkie moje instalacje były koszerne, i zasugerowałem, żebym przeniósł /usr/local/binsię na przód, $PATHaby móc użyć instalacji gitzamiast kopii systemowej. W porządku - ale pomiędzy path_helperi fishcoś się działo z $PATHtym , co wymknęło mi się spod kontroli i nigdy nie udało mi się ułożyć ścieżek we właściwy sposób.

Środowisko: OSX 10.8.2, przeniesieni z 10.7ish, ze xcodei zainstalowane DevTools, plus x11, homebrewifish

Więcej info: Mam ustawić domyślną powłokę Powrót Mój użytkownika do bashi próbowali różnych skorup thru terminal.app- bash, fish, sh. Przeniosłem /usr/local/binsię na szczyt, /etc/pathsale nic to nie zmieniło. Przejrzałem różne config.fishpliki i skomentowałem rzeczy, które mogą zepsuć $ PATH, nie pomogły. Mam następujące pliki /etc/paths.d/:

./10-homebrew zawierający /usr/local/bin

./20-fish zawierający /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz zawierający /opt/X11/bin

Dodałem set +xdo siebie profilei kiedy zaczynam terminal.appotrzymuję:

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$

Wygląda więc na to przebiegów path_helper, ale potem działa echo $PATHsiatek mi /usr/bin:/bin:/usr/sbin:/sbin. Wygląda na to, że path_helpernie robi już tego, co powinien?

Jestem pewien, że istnieje tu pewne dobrze zdefiniowane zachowanie, którego nie rozumiem lub próbowałem to naprawić. Proszę pomóż!


zauważ, że mogę sprawić, by działało fish, tworząc ~/.config/fish/config.fishz, set PATH /usr/local/bin $PATHale nadal mam problem z path_helperpozornie nie działaniem tak, jak powinien, a $PATHzatem jest niepełny. Wciąż mam też problem z różnymi $PATHskryptami, aplikacjami uruchamianymi z GUI itp.
Chris4d

Odpowiedzi:


5

rozwiązanie:

wybierz, jeśli chcesz ustawienie systemowe lub konfigurację użytkownika i edytuj odpowiedni plik konfiguracyjny, nie używaj path_helper z rybami.

więcej

fish nie źródło / etc / profile, dla konfiguracji całego systemu i konfiguracji użytkownika będzie czytał odpowiednio /etc/fish/config.fish i ~ / .config / fish / config.fish [1].

path_helper jest przeznaczony do używania w powłokach, które pobierają plik profilu systemowego (sh, csh i ich pochodne). Ponieważ 10.7 path_helper wydaje się honorować porządek w / etc / paths, AFAIR nie zrobił tego w 10.6 i trudniej sobie z tym poradzić.

Jeśli naprawdę chcesz używać path_helper z rybami, musisz przeanalizować dane wyjściowe, ponieważ zapewni on tylko składnię sh i csh z opcjami -s i -c .

Coś jak

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

powinien wykonać pracę:

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


Świetny! Oto, co mam teraz: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- działa dobrze z rybą 2 i Mac OS 10.8.3
topskip

3

Absolutnie nie mam pojęcia o /etc/paths.d, path_helper, i c., Które wydają mi się nadmiernymi komplikacjami, ale następujące na końcu twojego ~ / .bashrc powinny cię naprawić:

 PATH=/usr/local/bin:$PATH

Mam nadzieję że to pomoże!


Dzięki Aaron - path_helperto narzędzie specyficzne dla OSX, które podobno ustawia się $PATHprzy logowaniu, czytając /etc/pathsodtąd /etc/paths.d/*. W każdym razie rozumiem, że twoja sugestia powinna mnie naprawić bash, ale tak naprawdę chcę, aby działała fish(i konsekwentnie w całym systemie, jeśli nie jest to zbyt wiele do przewidzenia).
Chris4d

Ach - przepraszam za to. Nie jestem użytkownikiem systemu OS X, szkoda więcej, ale po odrobinie zawstydzenia w Google wygląda na to, że to pytanie o przepełnienie stosu może być bardziej podobne do tego, czego szukasz - i znowu: nie jestem Użytkownik systemu OS X sam odpowiedział i tylko dlatego, że szybkie (przeczytane: nieostrożne) spojrzenie na twoje pytanie sprawiło, że pomyślałem, że interesuje Cię tylko bash, więc skorzystaj z mojej porady tutaj z kilkoma ziarnami soli. Mam nadzieję, że to pomaga, mimo wszystko -
Aaron Miller

3

Dziękujemy Aaronowi za odpowiedź i wszystkim, którzy odpowiedzieli na inne podobne pytania na stronach stosu wymiany. Dla potomności, oto co wymyśliłem:

  1. path_helperjest wywoływany /etc/profileprzez składnię eval '/usr/libexec/path_helper -s'(gdzie apostrofy są tak naprawdę odwrotnością). Jak manekin, nie wiedziałem, jak działają backticksy, dlatego z jakiegoś powodu zmieniłem je na cytaty. To przerwało moje profileładowanie path_helper. Zastąpiłem tyknięcia i teraz działa tak, jak powinno (oczywiście).
  2. użycie set PATH /usr/local/bin $PATHw moim ~/.config/fish/profile.fishzapewnia, że ​​otrzymam odpowiednią kolejność w mojej preferowanej powłoce, ale dopóki path_helperdziała, może być zbędna.
  3. Aby upewnić się, że cały $PATHzestaw jest dostępny dla skryptów, aplikacji GUI itp., Wydaje się, że jest to sprzeczka między ... launchd.confi environment.plistwciąż badaniem tego.

1
Czytałem tylko innego dnia (ale nie pamiętam źródła), że 10.8 nie oferuje już niezawodnego sposobu, aby ścieżka była widoczna dla wszystkich aplikacji. W szczególności pamiętam, że środowisko.pl nie jest już czytane; Mam niejasną wiedzę na temat launchd.conf, więc to może zadziałać, ale myślę, że artykuł sugerował, że nie zadziała.
echristopherson

1
więcej działań następczych: nie wygląda na to, że path_helper w ogóle działa u ryb; wypisuje składnię csh lub bash, które są niekompatybilne. Zamiast tego możesz użyć ~ / .config / fish / config.fish (skrypt uruchamiania ryb) do cat /etc/paths.d/* i dołączyć je do zmiennej $ PATH. Mam nadzieję, że komuś pomoże!
Chris4d

czy w ogóle przeczytałeś moją odpowiedź? to było tam od czterech miesięcy przed następczych
anddam
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.