
Como configurar variáveis de ambiente no Mac OS X de forma que fiquem disponíveis para aplicativos GUI sem usar~/.MacOSX/environment.plistouGanchos de login(uma vez que estes sãodescontinuada)?
Responder1
No Mountain Lion, todas as /etc/paths
edições /etc/launchd.conf
não surtem efeito!
Os fóruns de desenvolvedores da Apple dizem:
"Altere o Info.plist do próprio .app para conter um dicionário" LSEnvironment "com as variáveis de ambiente desejadas.
~/.MacOSX/environment.plist não é mais compatível."
Então editei diretamente o aplicativo Info.plist
(clique com o botão direito em "AppName.app" (neste caso SourceTree) e depois em " Show package contents
")
e adicionei um novo par 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>
(ver:Documentação do LaunchServicesKeys na Apple)
agora o aplicativo (no meu caso SourceTree) usa o caminho fornecido e funciona com git 1.9.3 :-)
PS: É claro que você deve ajustar a entrada Path às suas necessidades específicas de caminho.
Responder2
A solução utiliza a funcionalidade do launchctl
, combinada com umAgente de lançamentopara imitar os ganchos de login antigos. Para outras soluções usando o armazenamento de launchd
, consulteesta comparação. O agente de lançamento usado aqui está localizado em/Biblioteca/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 é oRunAtLoadchave para que o agente de lançamento seja executado o mais cedo possível. O verdadeiro trabalho é feito no shell script/Users/Shared/conflaunchd.sh, onde se lê~/.conf.launchde 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 de path_helper
para obterCAMINHOconfigurar corretamente. Finalmente,~/.conf.launchdparece 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, consulte sua página de manual para obter mais informações. Funciona bem para mim (devo mencionar que ainda sou um cara do Snow Leopard), aplicativos GUI comotextstudioeTeXShopposso ver minha própria árvore tex. Coisas que podem ser melhoradas:
O script de shell contém um
#filename="$1"
arquivo. Isso não é acidental, pois o nome do arquivo deve ser inserido no script pelo agente de inicialização como argumento, mas isso não funciona.Como mencionadoaqui(Alemão e atrás de acesso pago!), é possível colocar o script no próprio agente de lançamento.
Não tenho certeza de quão segura é esta solução, pois ela é usada
eval
com strings fornecidas pelo usuário.Acho que lembrar que a definição de MANPATH usando esse método não funcionou bem, mas não tenho certeza.
Deve ser mencionado que a Apple pretendia uma abordagem semelhante, colocando coisas em∼/launchd.conf, mas atualmente não é suportado até esta data e sistema operacional (consulte a página de manual de launchd.conf
). Acho que coisas como globbing não funcionariam como nesta proposta. E é claro que é possível colocar esses arquivos em qualquer outro lugar, exceto no agente de lançamento, que deve residir em/Biblioteca/LaunchAgents/ou~/Biblioteca/LaunchAgents/.
Por fim, devo mencionar as fontes que utilizei como informações sobre Agentes de Lançamento: 1,2,3,4.
Atualizar: Isso não funciona na versão 10.8 no momento. As soluções alternativas por aplicativo são descritasaquieaqui.
Responder3
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
Responder4
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
, encerrando e reiniciando processos.
As configurações se /etc/launchd.conf
aplicam ao processo root launchd e aos processos launchd por usuário. Variáveis de ambiente definidas com setenv
in /etc/launchd.conf
são mostradas por sudo launchctl export
e launchctl export
.