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)
/usr/libexec/path_helperpodczas procesu inicjalizacji. Aplikacje GUI nie otrzymują ŚCIEŻKI zgodnie z/etc/paths- i zapytałem konkretnie o aplikacje GUI.