Configurando variáveis ​​de ambiente no OS X para aplicativos da GUI

18

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 )?

Percival Ulysses
fonte
@ ersin-er A resposta do StackOverflow "Solução para aplicativos de linha de comando e GUI de uma única fonte (funciona com Yosemite e El Capitan)" pode ser de interesse para as pessoas que encontrarem essa pergunta.
l --marc l

Respostas:

16

No Mountain Lion, toda a edição /etc/pathse /etc/launchd.confnã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")

Mostrar conteúdo do pacote

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 )

insira a descrição da imagem aqui

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.

Flori
fonte
11
Obrigado! Isso foi perfeito para mim. Em 10.11 (El Capitan), eu também precisei executar os comandos fornecidos por Matthew para ver minhas alterações Info.plistentrarem em vigor.
dsedivec
8

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_helperpara 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 launchctlcomandos, 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:

  1. 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.

  2. 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.

  3. Não tenho certeza de quão segura é essa solução, pois é usada evalcom as seqüências fornecidas pelo usuário.

  4. 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 .

Percival Ulysses
fonte
A propósito, se alguém quiser definir a variável PATH em um ambiente Terminal e usar esse agente de inicialização, sugiro que escreva 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 .
Percival Ulysses
3

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
Mateus
fonte
Eu tive o mesmo comportamento com El Capitan, e eu adicionei o seu ponto de resposta de @ flori
Seki
2

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 Finderpoderá ser adicionado.

No .bash_profileeu 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 .

Ury Marshak
fonte
0

Outra opção é usar /etc/launchd.conf. Por exemplo, alterei o padrão PATHadicionando 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.confreiniciando ou executando launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confe finalizando e reiniciando os processos.

As configurações se /etc/launchd.confaplicam ao processo de inicialização raiz e aos processos de inicialização por usuário. As variáveis ​​de ambiente definidas com setenvin /etc/launchd.confsão mostradas por ambos sudo launchctl exporte launchctl export.

Lri
fonte