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

15

Como é possível configurar variáveis de ambiente no Mac OS X de forma que elas estejam disponíveis para aplicativos de GUI sem usar ~ / .MacOSX / environment.plist ou Ganchos de Login (uma vez que estes são reprovado )?

    
por Percival Ulysses 18.09.2012 / 23:00

5 respostas

7

A solução usa a funcionalidade launchctl , combinada com um Launch Agent para imitar os ganchos de login antigos. Para outras soluções que usam o armazenamento de launchd , consulte esta comparação . O agente de lançamento 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 lançamento seja executado o mais cedo possível. O trabalho real é feito no shell script /Users/Shared/conflaunchd.sh ~ / .conf.launchd e o alimenta em 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 obter o PATH configurado corretamente. Finalmente, ~ / .conf.launchd 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 os comandos launchctl , consulte a manpage para mais informações. Funciona bem para mim (eu devo mencionar que ainda sou um cara do Snow Leopard), aplicações gráficas como texstudio e TeXShop podem ver minha própria árvore tex. Coisas que podem ser melhoradas:

  1. O script de shell tem um #filename="$1" . Isso não é acidental, pois o nome do arquivo deve ser alimentado para o script pelo agente de inicialização como um argumento, mas isso não funciona.

  2. Como mencionado aqui (Alemão e por trás de um paywall!), É possível colocar o script no próprio agente de lançamento.

  3. Não sei ao certo como essa solução é segura, pois ela usa eval com strings fornecidas pelo usuário.

  4. Eu penso em lembrar 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 em ∼ / launchd.conf , mas atualmente não é compatível com esta data e OS (veja a manpage de launchd.conf ). Eu acho que coisas como globbing não funcionariam como fazem nesta proposta. E, claro, pode-se colocar esses arquivos em qualquer outro lugar, exceto o agente de lançamento 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 .

Atualizar : Isso não funciona na versão 10.8 no momento. Soluções alternativas por aplicativo são descritas aqui e aqui .

    
por 19.09.2012 / 12:29
11

No Mountain Lion, a edição de /etc/paths e /etc/launchd.conf não produz efeito algum!

Fóruns para desenvolvedores da Apple dizem:

"Change the Info.plist of the .app itself to contain an "LSEnvironment" dictionary with the environment variables you want.

~/.MacOSX/environment.plist is no longer supported."

Então eu editei diretamente o Info.plist do aplicativo (clique com o botão direito em "AppName.app" (neste caso, SourceTree) e, em seguida, " Show package contents ")

eadicionouumnovoparchave/dictchamado:

<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 App (no meu caso SourceTree) usa o caminho dado e funciona com o git 1.9.3: -)

PS: É claro que você precisa ajustar a entrada do caminho para suas necessidades específicas de caminho.

    
por 24.01.2013 / 13:35
2

A resposta fornecida por @ percival-ulysses funciona para mim em 10.9 Mavericks com a seguinte pequena alteração: edite o script /Users/Shared/conflaunchd.sh logo antes de exit 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 para o PATH, o killall Finder também 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 .

    
por 02.11.2013 / 19:06
2

A resposta fornecida pelo @flori funciona para mim no Maverick, desde que eu execute os seguintes comandos no Terminal depois de alterar o arquivo plist

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder
    
por 24.07.2014 / 14:50
0

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 a /etc/launchd.conf reiniciando ou executando launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf e encerrando e reiniciando processos.

As configurações em /etc/launchd.conf se aplicam aos processos launchd raiz e aos processos launchd por usuário. Variáveis de ambiente definidas com setenv em /etc/launchd.conf são mostradas por sudo launchctl export e launchctl export .

    
por 24.09.2013 / 07:59