Respostas:
Crie um environment.plist
arquivo ~/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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>
launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
launchctl setenv PATH $PATH:/Applications/gradle/bin
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Você pode adicionar muitos launchctl
comandos dentro do <string></string>
bloco.
O plist
será ativado após a reinicialização 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 em El Capitan.
O Xcode 7.0+ não avalia variáveis de ambiente por padrão. O comportamento antigo pode ser ativado com este comando:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Editar]
Existem algumas situações em que isso não funciona. Se o computador for reiniciado e a opção "Reabrir janelas ao fazer login novamente" estiver selecionada, as janelas reabertas talvez não vejam as variáveis (talvez elas estejam abertas antes da execução do agente). Além disso, se você efetuar login via ssh, as variáveis não serão definidas (portanto, será necessário configurá-las em ~ / .bash_profile). Finalmente, isso não parece funcionar para a PATH em El Capitan e Sierra. Isso precisa ser definido via 'launchctl config user path ...' e em / etc / caminhos.
UseSanitizedBuildSystemEnvironment
).
[ Resposta original ]: Você ainda pode usar launchctl setenv variablename value
para definir uma variável para que seja escolhida por todos aplicativos (aplicativos gráficos iniciados pelo Dock ou Spotlight, além dos iniciados pelo terminal).
Obviamente, você não vai querer fazer isso toda vez que fizer login.
[ Editar ]: Para evitar isso, inicie AppleScript Editor
, digite um comando como este:
do shell script "launchctl setenv variablename value"
(Use várias linhas se desejar definir várias variáveis)
Agora salve ( ⌘
+ s
) como formato de arquivo: Aplicativo . Por fim, abra System Settings
→ Usuários e grupos → Itens de login e adicione seu novo aplicativo.
[ Resposta original ]: Para contornar este local, todas as variáveis que você deseja definir em um breve script de shell, consulte esta resposta anterior sobre como executar um script no login do MacOS . Dessa forma, o script será chamado quando o usuário efetuar login.
[ Editar ]: Nenhuma solução é perfeita, pois as variáveis serão definidas apenas para esse usuário específico, mas espero / acho que isso pode ser 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 Library / LaunchAgents locais diretórios , apontando para o mesmo script de shell.
Concedido, nenhuma dessas soluções alternativas é tão conveniente quanto /etc/launchd.conf .
[ Edição adicional ]: 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 tendo um problema, lembre-se de que precisará reiniciar os aplicativos para que isso entre em vigor. Além disso, se você definir variáveis no terminal via ~ / .profile ou ~ / .bash_profile , elas substituirão as coisas definidas via launchctl setenv para aplicativos iniciados no shell .
É possível definir variáveis de ambiente no Mac OS X 10.10 Yosemite com 3 arquivos + 2 comandos.
Arquivo principal com definição de variáveis 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 variáveis 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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>environment.user</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
A mesma definição de serviço para aplicativos de 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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>environment</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
E, finalmente, devemos registrar estes serviços:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
O que temos:
Questões / problemas:
Para que suas variáveis env sejam corretamente tomadas pelos aplicativos após a reinicialização do sistema, você precisará:
Isso acontece porque a Apple nega a ordem explícita dos serviços carregados, portanto as variáveis env são registradas paralelamente ao processamento da "fila de reabertura".
Mas, na verdade, reinicializo meu sistema apenas várias vezes por ano (em grandes atualizações), portanto não é grande coisa.
JAVA_HOME
), mas não para a PATH
variável (veja minha pergunta em perguntar diferente ).
launchd
, mas não seria possível carregar esses Daemons na inicialização (ou seja, antes do login)? Isso deve contornar todos os problemas que você menciona.
Citado de
Apple Developer Relations
10-Oct-2014 09:12 PM
Após muita deliberação, a engenharia removeu esse recurso. O arquivo
/etc/launchd.conf
foi removido intencionalmente por motivos de segurança. Como solução alternativa, você pode executarlaunchctl limit
como root cedo durante a inicialização, talvez a partir deLaunchDaemon
. (...)
Solução:
Coloque o código no
/Library/LaunchDaemons/com.apple.launchd.limit.plist
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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>core</string>
<string>unlimited</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist
/Library/LaunchDaemons
e, em vez de dizer launchctl
para executar o limit
comando, diga para executar o setenv
comando com PATH
uma string de caminho como argumentos. launchd
deve buscá-lo automaticamente na inicialização e se auto-modificar quase imediatamente.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/usr/local/bin/launchd.conf.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist
Agora você pode especificar comandos como setenv JAVA_HOME /Library/Java/Home
em /etc/launchd.conf
.
Verificado em El Capitan.
O que funcionou para mim (inspirado nos agradecimentos de aax):
Cole isso 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">
<plist version="1.0">
<dict>
<key>Label</key>
<string>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>16384</string>
<string>16384</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Se você precisar passo a passo:
⌘+v
). Isso forçará o limite para 16384 arquivos por processo e 16384 arquivos no totalesc
, em seguida,:wq
Espero que isso tenha ajudado.
Você pode tentar 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, já que o que você escreve é um script bash regular a ser originado pelo bash em primeiro lugar. Sem restrições .. (Verifique a documentação do osx-env-sync e você entenderá como isso ocorre).
Respondi a uma pergunta semelhante aqui, onde você encontrará mais.
A solução é adicionar sua variável a /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ê editá-lo de qualquer outra maneira, o sistema irá reclamar com um perfil / etc / danificado, mesmo que você altere as permissões para root.
Eu adicionei as variáveis no ~ / .bash_profile da seguinte maneira. Após concluir, reinicie / efetue logout e efetue 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
NOTA: sem reiniciar / sair e fazer login, você pode aplicar essas alterações usando;
source ~/.bash_profile