Dopo aver risolto i problemi PATH di OSX fino alla versione Mavericks, i problemi tornano in Yosemite !!!
Quindi voglio imitare la vecchia launch.conf
funzionalità della nuova versione di Yosemite per Mac OSX 10.10, al fine di rendere disponibile la variabile d'ambiente PATH nelle app GUI come Carbon Emacs o RStudio . Ho usato la grande idea di ursa utente stackoverflow per impostare uno script shell che configura le variabili di ambiente tramite launchctl
. (Vedi la sua risposta StackOverflow qui .) Funziona per la maggior parte delle variabili d'ambiente, ma non per la variabile PATH .
1. Che cosa ho fatto?
Prima ho scritto la /etc/environment.rc
sceneggiatura come:
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"
Quindi ho creato i piani per launchd
(elenchi di questi e di altri script citati nell'appendice di seguito). Poi li ho attivati con
$ sudo launchctrl load ...
Quindi ho disabilitato l' path_helper
utilità nel /etc/
profilo del file di shell shell , in modo che non sovrascriva le environment.rc
impostazioni. E finalmente ho riavviato la macchina.
2. Qual è l'effetto?
Quando avvio Terminal le nuove variabili d'ambiente JAVA_HOME
e ENVIRONMENT_RC
sono impostate in base environment.rc
, ma PATH è impostato su
/ Usr / bin: bin /
Per essere sicuro, nessun bash
file init ha interferito nel modo in cui ho scritto un piccolo script Python (anche nell'appendice) per mostrare le variabili nell'ambiente corrente e lo eseguo direttamente facendo doppio clic su un wrapper Platypus . Anche in questo caso vengono impostate le nuove variabili, mentre PATH ha l'impostazione predefinita del sistema.
Quindi perché posso impostare altre variabili, ma non la variabile PATH? E come posso risolverlo in modo unificato ?
Aggiornare:
La situazione è molto sconcertante: la shell ( bash
almeno) in Terminal o Emacs raccoglierà il PERCORSO impostato tramite launchctl
, ma le altre app della GUI non lo faranno. Ad esempio, lo script Python minimo menzionato direttamente chiamato Platypus non mostrerà la tua personalizzazione sentiero. E anche Emacs stesso non conosce il PERCORSO corretto: questo si nota ad esempio quando si emette il comando Emacs M-x ispell-buffer
; lo strumento unix ispell
che emacs tenta di chiamare non verrà trovato se si trova solo sul tuo percorso personalizzato.
Appendice
net.halloleo.environment.plist
, il file di configurazione launchd 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
, il file di configurazione launchd 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
, il file di avvio di bash modificato:
# 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
, lo script che mostra tutte le variabili di ambiente:
import os
print (os.environ)
/usr/libexec/path_helper
durante il loro processo di inizializzazione. Le app GUI non ottengono il PERCORSO in base a/etc/paths
- e ho chiesto specificamente sulle app GUI.