In che modo è possibile impostare le variabili di ambiente in Mac OS X in modo tale che siano disponibili per le applicazioni della GUI senza utilizzare ~ / .MacOSX / environment.plist o hook di accesso (poiché questi sono obsoleti )?
In che modo è possibile impostare le variabili di ambiente in Mac OS X in modo tale che siano disponibili per le applicazioni della GUI senza utilizzare ~ / .MacOSX / environment.plist o hook di accesso (poiché questi sono obsoleti )?
Risposte:
Su Mountain Lion tutto /etc/paths
e il /etc/launchd.conf
montaggio non ha alcun effetto!
I forum degli sviluppatori di Apple dicono:
"Modifica la Info.plist del .app stesso per contenere un dizionario" LSEnvironment "con le variabili di ambiente che desideri.
~ / .MacOSX / environment.plist non è più supportato. "
Quindi ho modificato direttamente l'app Info.plist
(tasto destro su "AppName.app" (in questo caso SourceTree) e poi " Show package contents
")
e ha aggiunto una nuova coppia chiave / dict chiamata:
<key>LSEnvironment</key>
<dict>
<key>PATH</key>
<string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>
(vedi: Documentazione LaunchServicesKeys su Apple )
ora l'app (nel mio caso SourceTree) usa il percorso indicato e funziona con git 1.9.3 :-)
PS: Ovviamente devi adattare la voce Path alle tue esigenze specifiche.
Info.plist
rendere effettive le mie modifiche .
La soluzione utilizza la funzionalità di launchctl
, combinata con un Launch Agent per imitare i vecchi hook di login. Per altre soluzioni che utilizzano il negozio di launchd
, vedere questo confronto . L'agente di avvio utilizzato qui si trova 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>Label</key>
<string>user.conf.launchd</string>
<key>Program</key>
<string>/Users/Shared/conflaunchd.sh</string>
<key>ProgramArguments</key>
<array>
<string>~/.conf.launchd</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>LimitLoadToSessionType</key>
<array>
<string>Aqua</string>
<string>StandardIO</string>
</array>
</dict>
</plist>
Una cosa importante è la chiave RunAtLoad in modo che l'agente di avvio venga eseguito il prima possibile. Il vero lavoro viene svolto nello script della shell /Users/Shared/conflaunchd.sh , che legge ~ / .conf.launchd e lo alimenta a launchctl
:
#! /bin/bash
#filename="$1"
filename="$HOME/.conf.launchd"
if [ ! -r "$filename" ]; then
exit
fi
eval $(/usr/libexec/path_helper -s)
while read line; do
# skip lines that only contain whitespace or a comment
if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi
eval launchctl $line
done <"$filename"
exit 0
Notare la chiamata di path_helper
per impostare PATH correttamente. Infine, ~ / .conf.launchd sembra così
setenv PATH ~/Applications:"${PATH}"
setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:
# Locale
setenv LANG en_US.UTF-8
Questi sono launchctl
comandi, vedere la sua manpage per ulteriori informazioni. Funziona bene per me (devo dire che sono ancora un ragazzo di Snow Leopard), applicazioni GUI come texstudio e TeXShop possono vedere il mio proprio albero tex. Cose che possono essere migliorate:
Lo script della shell ha un #filename="$1"
in esso. Ciò non è casuale, poiché il nome del file deve essere inserito nello script dall'agente di avvio come argomento, ma non funziona.
Come menzionato qui (tedesco e dietro un paywall!), È possibile inserire la sceneggiatura nell'agente di lancio stesso.
Non sono sicuro di quanto sia sicura questa soluzione, in quanto utilizza eval
con le stringhe fornite dall'utente.
Penso di ricordare che la definizione di MANPATH usando questo metodo non ha funzionato bene, ma non ne sono sicuro.
Va detto che Apple ha inteso un approccio un po 'simile inserendo elementi in launch / launchd.conf , ma al momento non è supportato in questa data e nel sistema operativo (vedere la manpage di launchd.conf
). Immagino che cose come il globbing non funzionerebbero come fanno in questa proposta. E ovviamente si possono mettere questi file altrove, tranne l'agente di avvio che deve risiedere in / Library / LaunchAgents / o ~ / Library / LaunchAgents / .
Infine, dovrei menzionare le fonti che ho usato come informazioni sugli agenti di lancio: 1 , 2 , 3 , 4 .
Aggiornamento : al momento non funziona con la versione 10.8. Le soluzioni alternative per applicazione sono descritte qui e qui .
export PATH=.:"$(launchctl getenv PATH)"
in ~ / .bash_profile (in modo simile per altre shell). Ciò è possibile poiché path_helper
viene chiamato nello script della shell. Per maggiori dettagli sulla variabile PATH in OS X, controlla questa risposta .
La risposta fornita da @flori funziona per me su Maverick a condizione che eseguo i seguenti comandi in Terminal dopo aver modificato il file plist
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
La risposta fornita da @ percival-ulysses funziona per me su 10.9 Mavericks con il seguente piccolo cambiamento: modifica lo script /Users/Shared/conflaunchd.sh subito prima exit 0
e aggiungi le righe
killall Dock
killall SystemUIServer
per riavviare il Dock e la barra dei menu. Successivamente, le applicazioni avviate dal Dock o da Spotlight erediteranno il PERCORSO corretto. Se usi Finder per avviare le applicazioni PATH-critical, allorakillall Finder
possibile aggiungere anche questo.
Nel .bash_profile
uso la linea
export PATH=`launchctl getenv PATH`
per impostare il PERCORSO per il Terminale, in questo modo il PERCORSO è controllato dalla stessa posizione, il file ~ / .conf.launchd .
Un'altra opzione è usare /etc/launchd.conf
. Ad esempio ho modificato il valore predefinito PATH
aggiungendo questa riga a /etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
È possibile applicare le modifiche /etc/launchd.conf
riavviando o eseguendolaunchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
terminando e processi.
Le impostazioni si /etc/launchd.conf
applicano sia al processo di avvio principale sia ai processi di avvio per utente. Le variabili d'ambiente impostate con setenv
in /etc/launchd.conf
sono mostrate da entrambi sudo launchctl export
e launchctl export
.