Tornar os itens adicionados aos caminhos via caminhos.d aparecer em todos os lugares sob o Mavericks

0

Eu gostaria de definir o caminho no OS X Mavericks para que a configuração apareça em todos os lugares (por exemplo, em .apps e em shells de Darwin). Há muita discussão por aí sobre como definir variáveis de ambiente geralmente sob OS X . Sem environments.plist mais suporte do Mavericks , parece que a edição/etc/launchd.conf é a melhor opção para isso. Infelizmente, o launchd.conf aparentemente não faz expansão de parâmetros , então não posso fazer isso:

setenv PATH /Users/kuzzooroo/anaconda/bin:$PATH

e eu não quero codificar todo o meu caminho - parece insustentável.

Há outra questão no AskDifferent especificamente sobre a configuração da variável de ambiente PATH para todo o sistema no Mavericks . A solução aceita é usar/etc/paths.d/ , mas alguém postou o seguinte comentário (que acumulou vários votos positivos) como uma ressalva:

Caminhos em paths.d são adicionados ao caminho por path_helper, que é executado a partir de / etc / profile e /etc/csh.login, mas não quando, por exemplo, bash é invocado como um shell não interativo ou não-login ou quando você executar programas em editores de texto.

Existe uma maneira de fazer esses ambientes puxarem caminhos.d (por exemplo, colocando um comando para processar caminhos.d em algum arquivo de configuração do bash que é executado mesmo para shells não interativos)?

kuzzooroo
fonte

Respostas:

0

Opção 1: apenas use /etc/launchd.conf

Adicione uma linha como

setenv PATH /Users/username/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

para /etc/launchd.confe reinicie para aplicar as alterações.

O caminho padrão é /usr/bin:/bin:/usr/sbin:/sbin.

/etc/launchd.conf aplica-se a todos os processos, o que inclui aplicativos gráficos, shells não-login e programas iniciados por jobs launchd.

Edite /etc/launchd.confmanualmente se você ver que algum programa ou instalador adicionou novos caminhos para /etc/pathsou /etc/paths.d/*.

Opção 2: use um job launchd para definir o caminho durante a inicialização

Salve este plist como /Library/LaunchDaemons/setpath.plist:

<?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>setpath</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-c</string>
    <string>launchctl setenv PATH "$((launchctl getenv PATH|tr : \\n
    cat /etc/paths /etc/paths.d/*)|awk '!a[$0]++'|paste -sd: -)"</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

O programa deve ser executado na próxima vez que você reiniciar. Ele altera o processo PATHraiz launchd, que é herdado pelo launchdprocesso do usuário .

Na minha opinião, é mais fácil apenas editar /etc/launchd.confembora.

Opção 3: faça o bash run path_helper mesmo para shells que não são de login

path_helper é executado a partir de /etc/profile, /etc/zshenve /etc/csh.login. zsh/etc/zshenvaté mesmo para shells não-login, mas bashnão lê /etc/profilepara shells não-login.

Isso faz com que seja bashexecutado path_helperpara shells não-login interativos e para shells não-login não-interativos:

echo 'eval $(/usr/libexec/path_helper -s)'>>~/.bashrc
setenv BASH_ENV /etc/profile|sudo tee -a /etc/launchd.conf

Ele não faz a bashexecução path_helperde shells de não-login não-interativos invocados como sh. Também não afeta aplicativos gráficos ou processos que não são iniciados a partir de shells.

Lri
fonte