Soluzione per riga di comando e applicazioni GUI da un'unica fonte (funziona con Mac OS X v10.10 (Yosemite) e Mac OS X v10.11 (El Capitan))
Supponiamo che tu abbia le definizioni delle variabili di ambiente nel tuo ~/.bash_profile
like nel seguente frammento:
export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
Abbiamo bisogno di un Launch Agent che verrà eseguito ad ogni accesso e in qualsiasi momento su richiesta che caricherà queste variabili nella sessione utente. Avremo anche bisogno di uno script di shell per analizzare queste definizioni e creare i comandi necessari per essere eseguiti dall'agente.
Creare un file con plist
suffisso (ad esempio denominato osx-env-sync.plist
) nella ~/Library/LaunchAgents/
directory con i seguenti contenuti:
<?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>osx-env-sync</string>
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-l</string>
<string>-c</string>
<string>
$HOME/.osx-env-sync.sh
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
-l
il parametro è fondamentale qui; è necessario per eseguire lo script della shell con una shell di login, in modo che ~/.bash_profile
sia originato prima di eseguire questo script.
Ora, lo script della shell. Crealo ~/.osx-env-sync.sh
con i seguenti contenuti:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Assicurarsi che lo script della shell sia eseguibile:
chmod +x ~/.osx-env-sync.sh
Ora carica l'agente di avvio per la sessione corrente:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Ri) Avvia un'applicazione GUI e verifica che sia in grado di leggere le variabili di ambiente.
L'installazione è persistente. Sopravviverà a ricominciare e ricominciare.
Dopo l'installazione iniziale (che hai appena fatto), se vuoi riflettere di nuovo eventuali cambiamenti nel ~/.bash_profile
tuo intero ambiente, rieseguendo il launchctl load ...
comando non eseguirai ciò che desideri; invece riceverai un avviso come il seguente:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Per ricaricare le variabili di ambiente senza passare attraverso il processo di logout / login, procedi come segue:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Infine, assicurati di riavviare le applicazioni già in esecuzione (incluso Terminal.app) per renderle consapevoli delle modifiche.
Ho anche spinto il codice e le spiegazioni qui in un progetto GitHub: osx-env-sync .
Spero che questa sia la soluzione definitiva, almeno per le ultime versioni di OS X (Yosemite & El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
per avviare l'applicazione GUI con un nuovo ambiente di sistema impostato.