W OSX Yosemite, dlaczego mogę ustawić wiele zmiennych środowiskowych dla aplikacji GUI, ale nie mogę ustawić konkretnej zmiennej PATH

16

Po rozwiązaniu problemów z PATH OSX aż do wydania Mavericks problemy wróciły w Yosemite !!!

Chcę więc naśladować starą launch.conffunkcję w nowej wersji systemu Mac OS X 10.10 Yosemite, aby mieć dostępną zmienną środowiskową PATH w aplikacjach GUI, takich jak Carbon Emacs lub RStudio . Wykorzystałem świetny pomysł ursa użytkownika stackoverflow, aby skonfigurować skrypt powłoki, który konfiguruje zmienne środowiskowe za pośrednictwem launchctl. (Zobacz jego odpowiedź dotyczącą przepełnienia stosu tutaj .) Działa to w przypadku większości zmiennych środowiskowych, ale nie w przypadku zmiennej PATH .

1. Co zrobiłem?

Najpierw napisałem /etc/environment.rcskrypt wyglądający następująco:

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

Następnie stworzyłem listy launchd(dla tych i innych wymienionych skryptów w załączniku poniżej). Następnie aktywowałem je za pomocą

$ sudo launchctrl load ...

Następnie wyłączyłem path_helpernarzędzie w /etc/profilu pliku inicjującego powłokę , aby nie zastępowało environment.rcustawień. I w końcu ponownie uruchomiłem maszynę.

2. Jaki jest efekt?

Kiedy uruchamiam Terminal nowe zmienne środowiskowe JAVA_HOMEi ENVIRONMENT_RCsą ustawione zgodnie z environment.rc, ale PATH jest ustawiony na

/ usr / bin: / bin

Aby się upewnić, żaden bashplik inicjujący nie przeszkadzał mi w napisaniu małego skryptu Pythona (również w dodatku), który pokazuje zmienne w bieżącym środowisku, i wykonuję to bezpośrednio, klikając dwukrotnie opakowanie Dziobaka . Ponownie ustawiono nowe zmienne, a PATH ma domyślne ustawienie systemowe.

Dlaczego więc mogę ustawić inne zmienne, ale nie zmienną PATH? Jak mogę rozwiązać to w ujednolicony sposób ?

Aktualizacja:

Sytuacja jest bardzo zagadkowa: powłoka ( bashprzynajmniej) w Terminalu lub Emacsie odbierze ŚCIEŻKĘ ustawioną przez ciebie launchctl, ale inne aplikacje GUI tego nie zrobią. Np. Wspomniany minimalny skrypt python bezpośrednio wywoływany przez Dziobaka nie pokaże twojego niestandardowego ścieżka. I nawet sam Emacs nie zna właściwej ŚCIEŻKI: Dostrzegasz to np. Po wydaniu polecenia Emacsa M-x ispell-buffer; narzędzie uniksowe, ispellktóre emacs próbuje wywołać, nie zostanie znalezione, jeśli jest po prostu na twojej niestandardowej ścieżce.


dodatek

net.halloleo.environment.plist, uruchomiony plik konfiguracyjny w /Library/LaunchDaemons/:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plist, uruchomiony plik konfiguracyjny w /Library/LaunchAgents/:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profile, zmodyfikowany plik startowy bash:

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.py, skrypt wyświetlający wszystkie zmienne środowiskowe:

import os
print (os.environ)
halloleo
źródło

Odpowiedzi:

3

ŚCIEŻKA w Yosemite może i powinna być ustawiona w pliku / etc / paths. Po prostu dodaj swoją ścieżkę na końcu tego pliku:

/usr/bin
/bin
/your/custom/path

Skrypt środowiska / etc / w oryginalnym poście zapewnia obsługę zmiennej PATH w aplikacjach GUI (testowane z Emacsem).

ursa
źródło
5
Działa to tylko w przypadku powłok wywoływanych /usr/libexec/path_helperpodczas procesu inicjalizacji. Aplikacje GUI nie otrzymują ŚCIEŻKI zgodnie z /etc/paths- i zapytałem konkretnie o aplikacje GUI.
halloleo
Zaktualizowałem odpowiedź i skrypt / etc / environment w oryginalnym poście
ursa
To dwie odpowiedzi, które dajesz - również OP mówi, że / etc / environment nie działa
użytkownik151019,
@mark (1) po podniesieniu tego pytania zaktualizowałem / etc / environment, a teraz obsługuje PATH. (2) odpowiedzią jest użycie / etc / paths
ursa
2
@mark Tak, i to jest dokładnie mój punkt, problem i pytanie: Jak mogę ustawić zmienną środowiskową PATH samych aplikacji GUI, gdy zostaną uruchomione za pomocą Findera? Wciąż nie ma jednak żadnego ogólnego rozwiązania tego problemu ...
halloleo
2

Zastanawiało mnie to przez długi czas (cóż, przez ostatnie kilka godzin). W końcu natknąłem się na ten raport o błędzie, który wydaje się dokładnie opisywać mój problem (nie jestem pewien, w jakim stopniu jest on związany z twoim problemem, ale wydaje się, że jest błąd w Yosemite / uruchomiony w połączeniu z PATH i takimi skryptami jako python:

http://www.openradar.me/18945659

Wydaje się, że rozwiązaniem jest uruchomienie skryptu powłoki, który następnie uruchamia python. Niezupełnie to, co lubię, ale tak właśnie jest ....

Claude
źródło
Dziękujemy za link do raportu o błędzie. Dobrze, że to teraz prawdziwy błąd. Znalazłem wokół niego kolejne sprzęgło; Zamieszczę to tutaj.
halloleo
1

Problem polega na tym, że uruchomiona dołącza inną zmienną PATH zamiast zamiany zmiennej w środowisku. Większość programów używa, getenvktóre zawsze zwraca pierwsze wystąpienie zmiennej, zamiast tego powłoki iterują wszystkie zmienne środowiskowe i importują je jako zmienne lokalne, zastępując poprzednie wystąpienia ostatnią.

Jest to oczywiście błąd podczas uruchamiania, zmienne środowiskowe przekazywane do programu powinny być unikalne.

StenSoft
źródło
1
Fajna odpowiedź w tle! Wydaje mi się, że w pociskach nie ma realnego obejścia, czy jest?
halloleo
@halloleo Możesz uruchomić polecenie, sh -c 'YOUR ORIGINAL COMMAND'które przekazuje je przez powłokę, wybierając PATHzestaw w uruchomionym.
StenSoft,