Dopo che ho avuto risolto i problemi di PATH OSX fino alla versione di Mavericks, i problemi tornano in Yosemite !!!
Quindi voglio imitare la vecchia funzionalità launch.conf
nella nuova versione di Yosemite per Mac OSX 10.10, in modo da avere la variabile d'ambiente PATH nelle app della GUI come Carbon Emacs o RStudio disponibili. Ho utilizzato la grande idea di utente stackoverflow ursa per impostare uno script di 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?
Per prima cosa ho scritto lo script /etc/environment.rc
simile al seguente:
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"
Poi ho creato i plists per launchd
(elenchi di questi e di altri script citati nell'appendice in basso). Quindi li ho attivati con
$ sudo launchctrl load ...
Quindi ho disabilitato l'utilità path_helper
nel profilo di shell% file /etc/
, in modo che non sovrascriva le impostazioni di environment.rc
. E finalmente ho riavviato la macchina.
2. Qual è l'effetto?
Quando avvio Terminal, le nuove variabili di ambiente JAVA_HOME
e ENVIRONMENT_RC
sono impostate in base a environment.rc
, ma PATH è impostato su
/ usr / bin: / bin
Per essere sicuri, nessun file init di bash
ha avuto il modo in cui ho scritto un piccolo script python invece (anche nell'appendice) per mostrare le variabili nell'ambiente corrente e lo eseguo direttamente facendo doppio clic su ornitorinco . Anche in questo caso vengono impostate le nuove variabili, mentre PATH ha l'impostazione predefinita di sistema.
Allora perché posso impostare altre variabili, ma non la variabile PATH? E come posso risolvere questo in modo unificato ?
Aggiornamento:
La situazione è molto sconcertante: la shell ( bash
almeno) in Terminal o Emacs raccoglierà il PATH impostato con launchctl
, ma altre app della GUI non lo faranno., ad es. lo script python minimale menzionato direttamente tramite Platypus non mostrerà il tuo percorso personalizzato. Ed anche Emacs stesso non conosce il PERCORSO corretto: lo noti per es. quando si emette il comando Emacs M-x ispell-buffer
; lo strumento unix ispell
che emacs prova a chiamare non verrà trovato se si trova solo sul tuo percorso personalizzato.
Appendice
net.halloleo.environment.plist
, il file di configurazione di 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 di 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)