Variáveis ​​de ambiente no Mac OS X

186

Atualização: o link abaixo não possui uma resposta completa . Ter que definir o caminho ou a variável em dois lugares (um para GUI e outro para shell) é ruim.

Não é duplicado de : definindo variáveis ​​de ambiente no OS X?


Vindo de um plano de fundo do Windows, onde é muito fácil definir e modificar variáveis ​​de ambiente (basta ir em Propriedades do sistema> Avançado> Variáveis ​​de ambiente), não parece ser tão simples no Mac OS 10.5. A maioria das referências diz que eu devo atualizar / etc / profile ou ~ / .profile. São equivalentes a Variáveis ​​do sistema e Variáveis ​​do usuário? Por exemplo, onde devo definir minha JAVA_HOMEvariável?


EDITAR:

Quero poder acessar a variável do terminal, bem como um aplicativo como o Eclipse. Além disso, espero não ter que reiniciar / sair para fazer isso entrar em vigor.

Abdullah Jibaly
fonte
E há alguns conselhos nas respostas à pergunta link não repetiu aqui ...
dmckee --- ex-moderador gatinho

Respostas:

142

Não há necessidade de duplicação. Você pode definir variáveis ​​de ambiente usadas pelo launchd (e processos filhos, ou seja, qualquer coisa que você inicie no Spotlight) usando launchctl setenv.

Por exemplo, se você deseja espelhar seu caminho atual no launchd depois de configurá-lo em .bashrcou onde:

PATH=whatever:you:want
launchctl setenv PATH $PATH

As variáveis ​​de ambiente não são atualizadas automaticamente nos aplicativos em execução. Você precisará reiniciar os aplicativos para obter as variáveis ​​de ambiente atualizadas (embora você possa apenas definir variáveis ​​em seu shell, por exemplo PATH=whatever:you:want; não há necessidade de reiniciar o terminal).

Matt Curtis
fonte
1
Parece a melhor resposta até agora, sem a necessidade de um aplicativo de terceiros!
Abdullah Jibaly
2
Isso não parece ser global: as variáveis ​​de ambiente definidas dessa maneira são locais para o usuário. Ainda não temos um mecanismo global para definir uma variável de ambiente.
10113 Andrew
@ Andrew O que você quer dizer com local para o usuário? Eu esperaria que todos os processos iniciados posteriormente a partir do launchd fossem afetados.
Matt Curtis
@MattCurtis: As variáveis ​​de ambiente definidas via launchctl setenvparecem estar visíveis apenas para o usuário que está fazendo a alteração. Se eu definir uma variável como um usuário comum, ela não estará visível para o root (via sudo) e vice-versa.
Andrew
2
@ Andrew OK, o root tem seu próprio launchd - ps aux | grep launchdmostrará isso. Verifique também man sudoquais documentos que sudo(por padrão) redefinem deliberadamente o ambiente - se você sudo -Epreservar o ambiente (incluindo variáveis ​​definidas launchctl setenv). Você tem uma aplicação real para isso, a propósito? Se sim, esse método funciona para você?
Matt Curtis
299

Existem vários lugares onde você pode definir variáveis ​​de ambiente.

  • ~/.profile: use isso para variáveis ​​que você deseja definir em todos os programas iniciados no terminal (observe que, diferentemente do Linux, todos os shells abertos no Terminal.app são shells de login).
  • ~/.bashrc: é invocado para shells que não são shells de login. Use isso para aliases e outras coisas que precisam ser redefinidas em subshells, não para variáveis ​​de ambiente herdadas.
  • /etc/profile: isso é carregado antes de ~ / .profile, mas é equivalente. Use-a quando desejar que a variável se aplique aos programas de terminal iniciados por todos os usuários na máquina (supondo que eles usem o bash).
  • ~/.MacOSX/environment.plist: é lido por loginwindow no login. Aplica-se a todos os aplicativos, incluindo os da GUI, exceto os lançados pelo Spotlight na 10.5 (não na 10.6). Requer que você efetue logout e logon novamente para que as alterações entrem em vigor. Este arquivo não é mais suportado no OS X 10.8.
  • launchdinstância do seu usuário : isso se aplica a todos os programas iniciados pelo usuário, GUI e CLI. Você pode aplicar as alterações a qualquer momento, usando o setenvcomando no launchctl. Em teoria , você deve poder inserir setenvcomandos ~/.launchd.confe launchdlê-los automaticamente quando o usuário efetuar login, mas, na prática, o suporte a esse arquivo nunca foi implementado. Em vez disso, você pode usar outro mecanismo para executar um script no logon e fazer com que esse script seja chamado launchctlpara configurar o launchdambiente.
  • /etc/launchd.conf: é lido pelo launchd quando o sistema é inicializado e quando um usuário efetua login. Eles afetam todos os processos do sistema, porque o launchd é o processo raiz. Para aplicar alterações ao root launchd em execução, você pode canalizar os comandos sudo launchctl.

As coisas fundamentais a entender são:

  • variáveis ​​de ambiente são herdadas pelos filhos de um processo no momento em que são bifurcadas.
  • o processo raiz é uma instância launchd e também há uma instância launchd separada por sessão do usuário.
  • O launchd permite alterar suas variáveis ​​de ambiente atuais usando launchctl; as variáveis ​​atualizadas são herdadas por todos os novos processos que bifurcam a partir de então.

Exemplo de configuração de uma variável de ambiente com o launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Agora, inicie o aplicativo GUI que usa a variável e pronto!

Para contornar o fato de que ~/.launchd.confnão funciona, você pode colocar o seguinte script em ~/Library/LaunchAgents/local.launchd.conf.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>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Então você pode colocar setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEdentro ~/.launchd.conf, e ele será executado a cada login.

Observe que, ao canalizar uma lista de comandos para o launchctl dessa maneira, você não poderá definir variáveis ​​de ambiente com valores que contenham espaços. Se você precisar fazer isso, você pode chamar launchctl da seguinte forma: launchctl setenv MYVARIABLE "QUOTE THE STRING".

Além disso, observe que outros programas executados no logon podem ser executados antes do agente de inicialização e, portanto, podem não ver as variáveis ​​de ambiente que ele define.

Laca
fonte
3
Na verdade, em relação ~/.MacOSX/environment.plistao meu Leão, ele é lido e usado. Apenas testei. Na verdade, eu prefiro o .launchd.conf porque uso o painel de preferências RCenvironment para mantê-lo.
Gilimanjaro 26/10
5
Não é possível ~/.launchd.conftrabalhar no 10.6.8 - ele não parece ter nenhum efeito. A página de manual também diz que este arquivo não é suportado no momento.
snowcrash09
4
~ / .launchd.conf não parece trabalhar em 10.7.3 quer e quando eu olhar na página man diz $ / .launchd.conf Seu arquivo PRINCIPAL launchd configuração (atualmente sem suporte)
sem criatividade
4
No 10.8 (Mountain Lion), ~ / .MacOSX / environment.plist não é mais suportado. De acordo com o Apple Dev, é necessário "Alterar a lista de informações do próprio .app para conter um dicionário" LSEnvironment "com as variáveis ​​de ambiente desejadas". Para obter mais informações, consulte apple.stackexchange.com/questions/57385/…
pnkfelix
3
@LaC Ótimo post abrangente; você poderia atualizá-lo para observar que ~/.launchd.confainda não é suportado e não funciona no OS X 10.8.3? Veja comoman launchd.conf
mklement0
12

Acho que o OP está procurando uma solução simples, semelhante a janelas.

aqui vai você:

https://www.macupdate.com/app/mac/14617/rcenvironment

Tom Teman
fonte
1
Uau, isso parece legal. ainda não tentei, mas parece exatamente o que eu precisava na descrição.
Abdullah Jibaly
6
Aliás, o link original parece ter quebrado desde que eu o publiquei (qual é o problema da Apple? 301 são caros?). Em vez disso, você pode usar este link: macupdate.com/app/mac/14617/rcenvironment
Tom Teman
Isto é realmente antigo. Confira a outra resposta que menciona osx-env-sync para obter uma solução moderna que funcione mesmo no OS X 10.10 (Yosemite) e acima.
22715 Warren P
1
Resuma as informações do link em sua resposta. Como já vimos, os links são quebrados por vários motivos.
precisa saber é o seguinte
7

Você pode ler sobre o linux, que é bem parecido com o Mac OS X. Ou você pode ler sobre o BSD Unix, que é um pouco mais próximo. Na maioria das vezes, as diferenças entre Linux e BSD não chegam a muito.

/etc/profile são variáveis ​​de ambiente do sistema.

~/.profile são variáveis ​​de ambiente específicas do usuário.

"onde devo definir minha variável JAVA_HOME?"

  • Você tem vários usuários? Eles se importam? Você bagunçaria outro usuário alterando a /etc/profile?

Geralmente, prefiro não mexer nas configurações de todo o sistema, mesmo sendo o único usuário. Prefiro editar minhas configurações locais.

S.Lott
fonte
5

Para aplicativos de GUI, você precisará criar e editar ~/.MacOSX/environment.plist. Mais detalhes aqui . Você precisará sair para que estes entrem em vigor. Não tenho certeza se eles também afetam aplicativos iniciados no Terminal, mas presumo que afetariam.

Para aplicativos iniciados no Terminal, você também pode editar o arquivo ~ / .profile.

JW.
fonte
2
Sim, o Terminal herdará as variáveis, assim como qualquer coisa iniciada no Terminal. Você pode usar o painel de preferências RCenvironment para manter as variáveis.
Gilimanjaro 26/10
1
Esta solução não funciona mais com algumas revisões do Mac OS X v10.7. Não acontece com nenhuma revisão do Mac OS X v10.8 ou superior. Em vez disso, consulte: stackoverflow.com/a/4567308/543738
LS
3

Basta abrir o ~/.profilearquivo, via nanoTerminal e digite lá:

export PATH=whatever/you/want:$PATH

Salve este arquivo (cmd + X e Y). Depois disso, efetue logout / login novamente ou apenas abra uma nova guia no Terminal e tente usar sua nova variável.

POR FAVOR, não se esqueça de adicionar ": $ PATH" depois do que / you / want, caso contrário, você apagará todos os caminhos na variável PATH, que existiam antes disso.

Migele
fonte
4
Isso se aplica apenas ao ambiente de comando bash. As variáveis ​​definidas aqui não são vistas pelos aplicativos da GUI.
21715 Warren P
3

Sincronize variáveis ​​de ambiente do OS X para aplicativos de linha de comando e GUI a partir de uma única fonte com osx-env-sync .

Também postei uma resposta para uma pergunta relacionada aqui .

Ersin Er
fonte
Isto é fantástico. Sugestão: Coloque a coisa launchctl unload / launctl load "refresh now" em um script. Eu chamei de osx-env-sync-now.sh. Modifico meu .bash_profile e executo o pequeno script "atualizar agora" e continuo. Eu acho que há implicações de segurança aqui, então acho que algumas limitações devem ser feitas. Deve haver razões que transformaram esta capacidade off no OS X.
Warren P
@WarrenP Done! Verifique o repo.
Ersin Er
Excelente. Isso resolveu muita dor para mim. Um caso em que isso é realmente útil é para qualquer pessoa que esteja desenvolvendo com o SCALA. Definir SCALA_HOME para a linha de comando scala e a GUI scala (como no netbeans) é uma verdadeira dor de outra forma.
21715 Warren P
0

Se você deseja alterar variáveis ​​de ambiente permanentemente no macOS, defina-as /etc/paths. Observe que esse arquivo é somente leitura por padrão; portanto, você precisará chmod para obter permissões de gravação.

IgorGanapolsky
fonte
Isso não funciona para mim. Eu tenho /usr/bin/localnesse arquivo, mesmo sem modificá-lo, era assim por padrão e, no entanto, meus aplicativos de GUI veem apenas /usr/bin:/bin:/usr/sbin:/sbin. Eu reiniciei muitas vezes.
mgol
@m_gol O que você ganha quando corre cat /etc/paths/?
IgorGanapolsky
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, em linhas separadas. E, no entanto, o SourceTree vê todos eles, exceto o primeiro.
mgol 21/01
Você pode editar para "Se você deseja alterar o caminho padrão no macOS". Isso não tem nada a ver com o problema mais geral das variáveis ​​de ambiente.
Rfay
0

Para usuários do 2020 Mac OS X Catalina em 2020:

Esqueça outras respostas inúteis, aqui apenas duas etapas são necessárias:

  1. Crie um arquivo com a convenção de nomenclatura: priority-appname. Em seguida, copie e cole o caminho que você deseja adicionar PATH.

    Por exemplo, 80-vscodecom conteúdo /Applications/Visual Studio Code.app/Contents/Resources/app/bin/no meu caso.

  2. Mova esse arquivo para /etc/paths.d/. Não se esqueça de abrir uma nova guia (nova sessão) no Terminal e digite echo $PATHpara verificar se o seu caminho foi adicionado!

Aviso: este método anexa apenas o seu caminho PATH.

Chovendo
fonte