Esistono diversi luoghi in cui è possibile impostare variabili di ambiente.
~/.profile
: usalo per le variabili che vuoi impostare in tutti i programmi lanciati dal terminale (nota che, a differenza di Linux, tutte le shell aperte in Terminal.app sono shell di login).
~/.bashrc
: viene invocato per le shell che non sono shell di login. Usalo per gli alias e altre cose che devono essere ridefiniti nei sottotitoli, non per le variabili di ambiente ereditate.
/etc/profile
: questo viene caricato prima di ~ / .profile, ma è altrimenti equivalente. Usalo quando vuoi che la variabile si applichi ai programmi terminali lanciati da tutti gli utenti sulla macchina (supponendo che usino bash).
~/.MacOSX/environment.plist
: viene letto da loginwindow al login. Si applica a tutte le applicazioni, comprese quelle della GUI, ad eccezione di quelle avviate da Spotlight in 10.5 (non 10.6). È necessario disconnettersi e accedere nuovamente per rendere effettive le modifiche. Questo file non è più supportato da OS X 10.8.
launchd
istanza del tuo utente : questo vale per tutti i programmi lanciati dall'utente, dalla GUI e dalla CLI. Puoi applicare le modifiche in qualsiasi momento utilizzando il setenv
comando in launchctl
. In teoria , dovresti essere in grado di inserire setenv
comandi ~/.launchd.conf
e launchd
leggerli automaticamente quando l'utente accede, ma in pratica il supporto per questo file non è mai stato implementato. Al contrario, è possibile utilizzare un altro meccanismo per eseguire uno script all'accesso e far richiamare tale script launchctl
per configurare l' launchd
ambiente.
/etc/launchd.conf
: viene letto da launchd all'avvio del sistema e quando un utente accede. Interessano ogni singolo processo sul sistema, poiché launchd è il processo principale. Per applicare le modifiche all'avvio root in esecuzione è possibile reindirizzare i comandi sudo launchctl
.
Le cose fondamentali da capire sono:
- le variabili di ambiente sono ereditate dai figli di un processo nel momento in cui vengono biforcate.
- il processo di root è un'istanza launchd e esiste anche un'istanza launchd separata per sessione utente.
- launchd ti permette di cambiare le sue attuali variabili d'ambiente usando
launchctl
; le variabili aggiornate vengono quindi ereditate da tutti i nuovi processi che inoltra da quel momento in poi.
Esempio di impostazione di una variabile di ambiente con launchd:
echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
Ora avvia la tua app GUI che utilizza la variabile e voilà!
Per aggirare il fatto che ~/.launchd.conf
non funziona, è possibile inserire il seguente script ~/Library/LaunchAgents/local.launchd.conf.plist
:
<?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>local.launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>launchctl < ~/.launchd.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Quindi puoi metterlo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE
all'interno ~/.launchd.conf
e verrà eseguito ad ogni accesso.
Si noti che, quando si esegue il piping di un elenco di comandi in launchctl in questo modo, non sarà possibile impostare variabili di ambiente con valori contenenti spazi. Se avete bisogno di farlo, è possibile chiamare launchctl come segue: launchctl setenv MYVARIABLE "QUOTE THE STRING"
.
Inoltre, si noti che altri programmi eseguiti al momento dell'accesso potrebbero essere eseguiti prima del launchagent e quindi potrebbero non vedere le variabili di ambiente impostate.