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.conf
funkcję 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.rc
skrypt 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_helper
narzędzie w /etc/
profilu pliku inicjującego powłokę , aby nie zastępowało environment.rc
ustawień. I w końcu ponownie uruchomiłem maszynę.
2. Jaki jest efekt?
Kiedy uruchamiam Terminal nowe zmienne środowiskowe JAVA_HOME
i ENVIRONMENT_RC
są ustawione zgodnie z environment.rc
, ale PATH jest ustawiony na
/ usr / bin: / bin
Aby się upewnić, żaden bash
plik 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 ( bash
przynajmniej) 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, ispell
któ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)
źródło
/usr/libexec/path_helper
podczas procesu inicjalizacji. Aplikacje GUI nie otrzymują ŚCIEŻKI zgodnie z/etc/paths
- i zapytałem konkretnie o aplikacje GUI.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 ....
źródło
Problem polega na tym, że uruchomiona dołącza inną zmienną PATH zamiast zamiany zmiennej w środowisku. Większość programów używa,
getenv
któ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.
źródło
sh -c 'YOUR ORIGINAL COMMAND'
które przekazuje je przez powłokę, wybierającPATH
zestaw w uruchomionym.