Como alguém configura variáveis de ambiente no Mac OS X para que elas estejam disponíveis para aplicativos da GUI sem usar ~ / .MacOSX / environment.plist ou ganchos de login (uma vez que estão obsoletos )?
Como alguém configura variáveis de ambiente no Mac OS X para que elas estejam disponíveis para aplicativos da GUI sem usar ~ / .MacOSX / environment.plist ou ganchos de login (uma vez que estão obsoletos )?
Respostas:
No Mountain Lion, toda a edição /etc/paths
e /etc/launchd.conf
não surte efeito!
Os fóruns de desenvolvedores da Apple dizem:
"Altere o Info.plist do .app para conter um dicionário" LSEnvironment "com as variáveis de ambiente que você deseja.
~ / .MacOSX / environment.plist não é mais suportado. "
Então, editei diretamente o aplicativo Info.plist
(clique com o botão direito do mouse em "AppName.app" (neste caso, SourceTree) e depois em " Show package contents
")
e adicionou um novo par de chave / dict chamado:
<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>
(consulte: Documentação LaunchServicesKeys na Apple )
agora o aplicativo (no meu caso, SourceTree) usa o caminho especificado e trabalha com o git 1.9.3 :-)
PS: É claro que você deve ajustar a entrada Caminho às suas necessidades específicas de caminho.
Info.plist
entrarem em vigor.
A solução usa a funcionalidade de launchctl
, combinada com um Launch Agent para imitar os ganchos de logon antigos. Para outras soluções usando a loja de launchd
, consulte esta comparação . O agente de inicialização usado aqui está localizado em / 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>
Uma coisa importante é a chave RunAtLoad, para que o agente de inicialização seja executado o mais rápido possível. O trabalho real é feito no script de shell /Users/Shared/conflaunchd.sh , que lê ~ / .conf.launchd e o alimenta para 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
Observe a chamada path_helper
para obter o PATH configurado corretamente. Finalmente, ~ / .conf.launchd se parece com isso
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
Estes são launchctl
comandos, veja sua página de manual para mais informações. Funciona bem para mim (devo mencionar que ainda sou um cara do Snow Leopard), aplicativos de GUI como o texstudio e o TeXShop podem ver minha própria árvore de tex. Coisas que podem ser melhoradas:
O script de shell tem um #filename="$1"
nele. Isso não é acidental, pois o nome do arquivo deve ser alimentado no script pelo agente de inicialização como argumento, mas isso não funciona.
Como mencionado aqui (em alemão e por trás de um paywall!), É possível colocar o script no próprio agente de lançamento.
Não tenho certeza de quão segura é essa solução, pois é usada eval
com as seqüências fornecidas pelo usuário.
Acho que lembro que a definição de MANPATH usando esse método não funcionou bem, mas não tenho certeza.
Deve-se mencionar que a Apple pretendia uma abordagem um pouco semelhante colocando coisas no ∼ / launchd.conf , mas atualmente não há suporte para essa data e sistema operacional (consulte a página de launchd.conf
). Eu acho que coisas como globbing não funcionariam como na proposta. E, é claro, é possível colocar esses arquivos em qualquer outro lugar, exceto no agente de inicialização que deve residir em / Library / LaunchAgents / ou ~ / Library / LaunchAgents / .
Por fim, devo mencionar as fontes que usei como informações sobre os agentes de lançamento: 1 , 2 , 3 , 4 .
Atualização : isso não funciona na versão 10.8 no momento. As soluções alternativas por aplicativo são descritas aqui e aqui .
export PATH=.:"$(launchctl getenv PATH)"
em ~ / .bash_profile (da mesma forma para outros shells). Isso é possível, pois path_helper
é chamado no script de shell. Para mais detalhes sobre a variável PATH no OS X, verifique esta resposta .
A resposta fornecida por @flori funciona para mim no Maverick, desde que eu execute os seguintes comandos no Terminal após alterar o arquivo plist
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
killall Finder
A resposta fornecida por @ percival-ulysses funciona para mim no Mavericks 10.9 com a seguinte pequena alteração: edite o script /Users/Shared/conflaunchd.sh antesexit 0
e adicione as linhas
killall Dock
killall SystemUIServer
para reiniciar o Dock e a barra de menus. Depois disso, os aplicativos iniciados no Dock ou no Spotlight herdarão o PATH correto. Se você usar o Finder para iniciar os aplicativos críticos do PATH, também killall Finder
poderá ser adicionado.
No .bash_profile
eu uso a linha
export PATH=`launchctl getenv PATH`
para definir o PATH para o Terminal, desta forma o PATH é controlado a partir do mesmo local, o arquivo ~ / .conf.launchd .
Outra opção é usar /etc/launchd.conf
. Por exemplo, alterei o padrão PATH
adicionando esta linha a /etc/launchd.conf
:
setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin
Você pode aplicar alterações /etc/launchd.conf
reiniciando ou executando launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf
e finalizando e reiniciando os processos.
As configurações se /etc/launchd.conf
aplicam ao processo de inicialização raiz e aos processos de inicialização por usuário. As variáveis de ambiente definidas com setenv
in /etc/launchd.conf
são mostradas por ambos sudo launchctl export
e launchctl export
.