Configurar variables ​​de ambiente via launchd.conf não funciona mais no OS X Yosemite / El Capitan / macOS Sierra?

Parece que o launchd.conf não carrega mais minha variável de ambiente. Alguém mais notou aquilo?

Existe outra solução para definir permanentemente variables ​​de ambiente?

    Crie um arquivo environment.plist em ~/Library/LaunchAgents/ com este conteúdo:

     < ?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">   Label my.startup ProgramArguments  sh -c  launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk launchctl setenv PATH $PATH:/Applications/gradle/bin   RunAtLoad    

    Você pode adicionar muitos comandos launchctl dentro do bloco .

    O plist será ativado após a reboot do sistema. Você também pode usar launchctl load ~/Library/LaunchAgents/environment.plist para iniciá-lo imediatamente.

    [Editar]

    A mesma solução também funciona no El Capitan.

    O Xcode 7.0+ não avalia variables ​​de ambiente por padrão. O comportamento antigo pode ser ativado com este comando:

    defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO

    [Editar]

    Há algumas situações em que isso não funciona bem. Se o computador for reiniciado e a opção “Reabertura de janelas ao efetuar login novamente” for selecionada, as janelas reabertas poderão não ver as variables ​​(talvez elas sejam abertas antes da execução do agente). Além disso, se você efetuar login via ssh, as variables ​​não serão configuradas (então você precisará configurá-las em ~ / .bash_profile). Finalmente, isso não parece funcionar para o PATH no El Capitan and Sierra. Isso precisa ser definido via ‘caminho do usuário launchctl config …’ e em / etc / paths.

    [ Resposta original ]: Você ainda pode usar o launchctl setenv variablename value para definir uma variável para que seja escolhida por todos os aplicativos (aplicativos charts iniciados por meio do Dock ou Spotlight, além daqueles iniciados por meio do terminal).

    Obviamente, você não vai querer fazer isso toda vez que fizer o login.

    [ Edit ]: Para evitar isso, inicie o AppleScript Editor , digite um comando como este:

     do shell script "launchctl setenv variablename value" 

    (Use várias linhas se você quiser definir várias variables)

    Agora salve ( + s ) como formato de arquivo: aplicativo . Finalmente, abra System SettingsUsuários e GruposItens de Login e adicione seu novo aplicativo.

    [ Resposta original ]: Para contornar este lugar, todas as variables ​​que você deseja definir em um script de shell curto, então dê uma olhada nesta resposta anterior sobre como executar um script no login do MacOS . Dessa forma, o script será invocado quando o usuário fizer login.

    [ Edit ]: Nenhuma solução é perfeita, pois as variables ​​só serão definidas para aquele usuário específico, mas espero que seja tudo o que você precisa.

    Se você tiver vários usuários, poderá definir manualmente um Item de Login para cada um deles ou colocar uma cópia de com.user.loginscript.plist em cada um de seus diretórios Library / LaunchAgents locais, apontando para o mesmo script de shell.

    Concedido, nenhuma dessas soluções alternativas é tão conveniente quanto o /etc/launchd.conf .

    [ Further Edit ]: Um usuário abaixo menciona que isso não funcionou para ele. No entanto eu testei em várias máquinas Yosemite e funciona para mim. Se você estiver com um problema, lembre-se de que precisará reiniciar os aplicativos para que isso entre em vigor. Além disso, se você definir variables ​​no terminal por meio de ~ / .profile ou ~ / .bash_profile , elas replaceão as configurações definidas por launchctl setenv para aplicativos iniciados a partir do shell .

    É possível definir variables ​​de ambiente no Mac OS X 10.10 Yosemite com 3 arquivos + 2 comandos.

    Arquivo principal com definição de variables ​​de ambiente:

     $ ls -la /etc/environment -r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment $ cat /etc/environment #!/bin/sh set -e syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start" launchctl setenv JAVA_HOME /usr/local/jdk1.7 launchctl setenv MAVEN_HOME /opt/local/share/java/maven3 if [ -x /usr/libexec/path_helper ]; then export PATH="" eval `/usr/libexec/path_helper -s` launchctl setenv PATH $PATH fi osascript -e 'tell app "Dock" to quit' syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete" 

    Definição de serviço para carregar variables ​​de ambiente para aplicativos do usuário (terminal, IDE, …):

     $ ls -la /Library/LaunchAgents/environment.user.plist -rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist $ sudo cat /Library/LaunchAgents/environment.user.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">   Label environment.user ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

    A mesma definição de serviço para aplicativos do usuário raiz:

     $ ls -la /Library/LaunchDaemons/environment.plist -rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist $ sudo cat /Library/LaunchDaemons/environment.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">   Label environment ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

    E finalmente devemos registrar esses serviços:

     $ launchctl load -w /Library/LaunchAgents/environment.user.plist $ sudo launchctl load -w /Library/LaunchDaemons/environment.plist 

    O que nós temos:

    1. O único local para declarar variables ​​de ambiente do sistema: / etc / environment
    2. Atualização automática instantânea de variables ​​de ambiente após a modificação do arquivo / etc / environment – basta relançar seu aplicativo

    Problemas / problemas:

    Para que suas variables ​​env sejam corretamente tomadas pelos aplicativos após a reboot do sistema, você precisará de:

    • faça o login duas vezes: login => logout => login
    • ou fechar e reabrir aplicativos manualmente, onde as variables ​​env devem ser tomadas
    • ou NÃO use o recurso “Reabrir janelas ao fazer login”.

    Isso acontece porque a Apple nega a ordenação explícita de serviços carregados, portanto, as variables ​​env são registradas em paralelo com o processamento da “fila de reabertura”.

    Mas na verdade, eu reinicio o meu sistema apenas várias vezes por ano (em grandes atualizações), por isso não é um grande negócio.

    Citado de

    Apple Developer Relations 10-Oct-2014 09:12 PM

    Depois de muita deliberação, a engenharia removeu esse recurso. O arquivo /etc/launchd.conf foi intencionalmente removido por razões de segurança. Como solução alternativa, você pode executar launchctl limit como root no início da boot, talvez a partir de um LaunchDaemon . (…)

    Solução:

    Coloque o código em /Library/LaunchDaemons/com.apple.launchd.limit.plist por bash-script:

     #!/bin/bash echo '< ?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">   Label eicar ProgramArguments  /bin/launchctl limit core unlimited  RunAtLoad  ServiceIPC   ' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist 

    Aqui estão os comandos para restaurar o comportamento antigo:

     # create a script that calls launchctl iterating through /etc/launchd.conf echo '#!/bin/sh while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf; ' > /usr/local/bin/launchd.conf.sh # make it executable chmod +x /usr/local/bin/launchd.conf.sh # launch the script at startup echo '< ?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">   Label launchd.conf ProgramArguments  sh -c /usr/local/bin/launchd.conf.sh  RunAtLoad    ' > /Library/LaunchAgents/launchd.conf.plist 

    Agora você pode especificar comandos como setenv JAVA_HOME /Library/Java/Home em /etc/launchd.conf .

    Verificado no El Capitan.

    O que funcionou para mim (inspirado no aax ‘thanks):

    Cole isto em /Library/LaunchDaemons/com.apple.launchd.limit.plist e reinicie:

     < ?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">   Label eicar ProgramArguments  /bin/launchctl limit maxfiles 16384 16384  RunAtLoad  ServiceIPC    

    Se você precisar, passo a passo:

    • Lançar terminal
    • Digite sudo su e digite sua senha para logar como root
    • Digite vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
    • Quando estiver no editor vi, pressione a tecla i para entrar no modo de inserção e cole o conteúdo do código exato acima ( ⌘+v ). Isso forçará o limite para 16384 arquivos por processo e um total de 16384 arquivos
    • Salve seu arquivo e saia usando esc então :wq
    • Reinicialize seu sistema e verifique se ele está funcionando usando o comando launchctl limit

    Espero que isso tenha ajudado você.

    Você pode experimentar o https://github.com/ersiner/osx-env-sync . Ele lida com aplicativos de linha de comando e GUI de uma única fonte e funciona com a versão mais recente do OS X (Yosemite).

    Você pode usar substituições de caminho e outros truques de shell desde que o que você escreve é ​​um script bash regular para ser originado pelo bash em primeiro lugar. Sem restrições .. (Verifique a documentação do osx-env-sync e você entenderá como isso é feito.)

    Eu respondi uma pergunta semelhante aqui, onde você encontrará mais.

    A solução é adicionar sua variável ao /etc/profile . Então tudo funciona como esperado! Claro que você DEVE fazê-lo como usuário root com o sudo nano / etc / profile. Se você editar de alguma outra forma, o sistema irá reclamar com um / etc / profile danificado, mesmo se você alterar as permissions para root.

    Eu adicionei as variables ​​no ~ / .bash_profile da seguinte maneira. Depois que você terminar, reinicie / efetue logout e faça o login

     export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3 export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4 launchctl setenv M2_HOME $M2_HOME launchctl setenv ANT_HOME $ANT_HOME export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin launchctl setenv PATH $PATH 

    OBSERVAÇÃO: sem reiniciar / efetuar logout e efetuar login, você pode aplicar essas alterações usando;

     source ~/.bash_profile