Solução para aplicativos de linha de comando e GUI de uma única fonte (funciona com o Mac OS X versão 10.10 (Yosemite) e o Mac OS X versão 10.11 (El Capitan))
Vamos supor que você tenha definições de variáveis de ambiente ~/.bash_profile
semelhantes no seguinte trecho:
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"
Precisamos de um agente de inicialização que seja executado em cada login e a qualquer momento, sob demanda, que carregará essas variáveis na sessão do usuário. Também precisaremos de um script de shell para analisar essas definições e criar os comandos necessários a serem executados pelo agente.
Crie um arquivo com plist
sufixo (por exemplo, nomeado osx-env-sync.plist
) no ~/Library/LaunchAgents/
diretório com o seguinte conteúdo:
<?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
parâmetro é crítico aqui; é necessário executar o script de shell com um shell de logon, para que ~/.bash_profile
seja originado em primeiro lugar antes da execução desse script.
Agora, o script de shell. Crie-o ~/.osx-env-sync.sh
com o seguinte conteúdo:
grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
launchctl setenv ${envvar} ${!envvar}
done
Verifique se o script do shell é executável:
chmod +x ~/.osx-env-sync.sh
Agora, carregue o agente de inicialização para a sessão atual:
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
(Re) Inicie um aplicativo GUI e verifique se ele pode ler as variáveis de ambiente.
A instalação é persistente. Ele sobreviverá a reinicializações e logins.
Após a configuração inicial (que você acabou de fazer), se desejar refletir ~/.bash_profile
novamente as alterações no seu ambiente inteiro, launchctl load ...
execute novamente o comando não executará o que você deseja; em vez disso, você receberá um aviso como o seguinte:
<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress
Para recarregar suas variáveis de ambiente sem passar pelo processo de logout / login, faça o seguinte:
launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist
Finalmente, certifique-se de reiniciar seus aplicativos já em execução (incluindo o Terminal.app) para torná-los cientes das alterações.
Também enviei o código e as explicações aqui para um projeto do GitHub: osx-env-sync .
Espero que essa seja a solução definitiva, pelo menos para as versões mais recentes do OS X (Yosemite e El Capitan).
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/
para iniciar o aplicativo GUI com um novo ambiente de sistema definido.