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