Solución para aplicaciones de línea de comandos y GUI desde una sola fuente (funciona con Mac OS X v10.10 (Yosemite) y Mac OS X v10.11 (El Capitan))
Supongamos que tiene definiciones de variables de entorno en su ~/.bash_profile
gusto en el siguiente fragmento:
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"
Necesitamos un Agente de inicio que se ejecutará en cada inicio de sesión y en cualquier momento a pedido que cargue estas variables en la sesión del usuario. También necesitaremos un script de shell para analizar estas definiciones y crear los comandos necesarios para que el agente los ejecute.
Cree un archivo con plist
sufijo (por ejemplo, nombrado osx-env-sync.plist
) en el ~/Library/LaunchAgents/
directorio con los siguientes contenidos:
<?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
el parámetro es crítico aquí; es necesario para ejecutar el script de shell con un shell de inicio de sesión para que ~/.bash_profile
se obtenga en primer lugar antes de que se ejecute este script.
Ahora, el script de shell. Créelo en ~/.osx-env-sync.sh
con los siguientes contenidos:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Asegúrese de que el script de shell sea ejecutable:
chmod +x ~/.osx-env-sync.sh
Ahora, cargue el agente de lanzamiento para la sesión actual:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Re) Inicie una aplicación GUI y verifique que puede leer las variables de entorno.
La configuración es persistente. Sobrevivirá a los reinicios y reinicios de sesión.
Después de la configuración inicial (que acaba de hacer), si desea reflejar cualquier cambio en su ~/.bash_profile
entorno completo nuevamente, volver a ejecutar el launchctl load ...
comando no realizará lo que desea; en su lugar, recibirá una advertencia como la siguiente:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Para volver a cargar las variables de entorno sin pasar por el proceso de cierre de sesión / inicio de sesión, haga lo siguiente:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Finalmente, asegúrese de relanzar sus aplicaciones que ya se están ejecutando (incluida Terminal.app) para informarles de los cambios.
También envié el código y las explicaciones aquí a un proyecto de GitHub: osx-env-sync .
Espero que esta sea la solución definitiva, al menos para las últimas versiones de OS X (Yosemite y El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
para iniciar la aplicación GUI con un nuevo entorno de sistema establecido.