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:
-
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. -
Como mencionado aqui (Alemão e por trás de um paywall!), É possível colocar o script no próprio agente de lançamento.
-
Não sei ao certo como essa solução é segura, pois ela usa
eval
com strings fornecidas pelo usuário. -
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 .