Nachdem ich die PATH-Probleme von OSX bis zur Veröffentlichung von Mavericks geklärt hatte, tauchen die Probleme in Yosemite wieder auf !!!
Daher möchte ich die alte launch.conf
Funktion in der neuen Yosemite-Version von Mac OSX 10.10 nachahmen , um die Umgebungsvariable PATH in GUI-Apps wie Carbon Emacs oder RStudio verfügbar zu haben. Ich habe die großartige Idee des Stackoverflow-Benutzers ursa genutzt , um ein Shell-Skript einzurichten, mit dem Umgebungsvariablen über konfiguriert werden launchctl
. (Die Antwort auf den Stackoverflow finden Sie hier .) Dies funktioniert für die meisten Umgebungsvariablen, jedoch nicht für die PATH-Variable .
1. Was habe ich getan?
Zuerst habe ich das /etc/environment.rc
Skript so geschrieben:
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"
Dann habe ich die Plists für erstellt launchd
(Auflistungen dieser und der anderen erwähnten Skripte im Anhang unten). Dann habe ich sie mit aktiviert
$ sudo launchctrl load ...
Dann habe ich das path_helper
Dienstprogramm im Shell-Init-Dateiprofil deaktiviert /etc/
, damit es die environment.rc
Einstellungen nicht überschreibt . Und schließlich habe ich die Maschine neu gestartet.
2. Was ist der Effekt?
Wenn ich starten Terminal die neuen Umgebungsvariablen JAVA_HOME
und ENVIRONMENT_RC
werden entsprechend environment.rc
, aber PATH gesetzt ist
/ usr / bin: / bin
Um sicherzugehen, dass keine bash
Init-Datei im Weg ist, habe ich stattdessen (auch im Anhang) ein kleines Python-Skript geschrieben, um die Variablen in der aktuellen Umgebung anzuzeigen, und ich führe dies direkt durch Doppelklick auf einen Platypus- Wrapper aus. Wieder werden die neuen Variablen gesetzt, während PATH den Systemstandard hat.
Warum kann ich also andere Variablen festlegen, aber nicht die PATH-Variable? Und wie kann ich das auf einheitliche Weise lösen ?
Aktualisieren:
Die Situation ist sehr rätselhaft: Die Shell ( bash
zumindest) in Terminal oder Emacs übernimmt den Pfad, den Sie über festgelegt haben launchctl
, andere GUI-Apps tun dies jedoch nicht. Beispiel: Das erwähnte minimale Python-Skript, das direkt über Platypus aufgerufen wird, zeigt Ihren benutzerdefinierten Pfad nicht an Pfad. Und selbst Emacs selbst kennt den korrekten PFAD nicht: Sie bemerken dies z. B., wenn Sie den Emacs-Befehl eingeben M-x ispell-buffer
. Das Unix-Tool, ispell
das Emacs aufzurufen versucht, wird nicht gefunden, wenn es sich nur auf Ihrem benutzerdefinierten Pfad befindet.
Blinddarm
net.halloleo.environment.plist
, die launchd Konfigurationsdatei in /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
, die launchd Konfigurationsdatei in /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
, die modifizierte Bash-Startdatei:
# 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
, das Skript, das alle Umgebungsvariablen anzeigt:
import os
print (os.environ)
/usr/libexec/path_helper
während ihres Initialisierungsprozesses aufgerufen werden. GUI - Anwendungen nicht nicht erhalten die PATH nach/etc/paths
- und ich ausdrücklich darum gebeten , über GUI - Anwendungen.