Configurando variáveis ​​de ambiente no OS X


849

Qual é a maneira correta de modificar variáveis ​​de ambiente como PATH no OS X?

Procurei um pouco no Google e encontrei três arquivos diferentes para editar:

  • / etc / caminhos
  • ~ / .profile
  • ~ / .tcshrc

Eu nem tenho alguns desses arquivos e tenho certeza de que .tcshrc está errado, pois o OS X usa o bash agora. Onde estão definidas essas variáveis, especialmente PATH?

Estou executando o OS X v10.5 (Leopard).


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/para iniciar o aplicativo GUI com um novo ambiente de sistema definido.
— Hong

Respostas:


652

Bruno está no caminho certo. Eu fiz uma extensa pesquisa e, se você deseja definir variáveis ​​disponíveis em todos os aplicativos GUI, sua única opção é /etc/launchd.conf.

Observe que environment.plist não funciona para aplicativos iniciados pelo Spotlight. Isso está documentado por Steve Sexton aqui .

  1. Abra um prompt de terminal

  2. Tipo sudo vi /etc/launchd.conf(nota: este arquivo ainda pode não existir)

  3. Coloque conteúdos como os seguintes no arquivo

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
    
  4. Salve suas alterações no vi e reinicie o seu Mac. Ou use o comando grep/ xargsque é mostrado no comentário do código acima.

  5. Prove que suas variáveis ​​estão funcionando, abrindo uma janela do Terminal e digitando exporte você deverá ver suas novas variáveis. Eles também estarão disponíveis no IntelliJ IDEA e em outros aplicativos da GUI iniciados pelo Spotlight.


3
Estou dizendo que a resposta aceita (environment.plist) não foi bem-sucedida para mim. Usei com êxito a abordagem launchd.conf nas versões 10.5 e 10.6 em quatro máquinas.
— Matthew McCullough

54
Existe alguma maneira de fazer isso sem fazer uma reinicialização do sistema ?
— sorin

40
A limitação mencionada acima se aplica ao MacOS X 10.5. No entanto, o MacOS X 10.6 não possui mais essa limitação e a definição dos valores dentro de environment.plist funciona bem mesmo para aplicativos lançados via holofote. Portanto, a resposta selecionada está correta para o Snow Leopard ;-)
— Louis Jacomet

5
A configuração launchd.confé uma maneira, mas precisa de uma reinicialização (para reiniciar o launchd). Se você quer evitar uma reinicialização, veja a minha resposta stackoverflow.com/questions/135688/...
— Matt Curtis

23
Existem vários problemas com a abordagem de inicialização apresentada. A maioria é específica da variável de ambiente PATH, mas o solicitante mencionou PATH especificamente. 1) os itens no launchd.conf não são aplicados em shells interativos, como ssh, no sistema. 2) ter a linha "setenv PATH / testdir" anexa ao PATH no Terminal.app, mas afasta todos os outros itens do PATH nos ambientes do OS X Applications. 3) Fazer "setenv PATH $ {PATH}: / testdir" no /etc/launchd.conf não expande adequadamente o $ PATH existente 4) O launchd.conf se aplica a todos os usuários, em vez de apenas um. Não que eu tenha um soln melhor.
— NoahR

257

Como definir o ambiente para novos processos iniciados pelo Spotlight (sem a necessidade de reinicialização)

Você pode definir o ambiente usado pelo launchd (e, por extensão, qualquer coisa iniciada no Spotlight) com launchctl setenv. Por exemplo, para definir o caminho:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Ou se você deseja configurar seu caminho .bashrcou algo semelhante, espelhe-o no launchd:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Não há necessidade de reinicializar, mas você precisará reiniciar um aplicativo se desejar que ele recupere o ambiente alterado.

Isso inclui todos os shells já em execução no Terminal.app, embora, se você estiver lá, possa definir o ambiente mais diretamente, por exemplo, com export PATH=/opt/local/bin:/opt/local/sbin:$PATHpara bash ou zsh.

Como manter as alterações após uma reinicialização

Para manter as alterações após uma reinicialização, é possível definir as variáveis ​​de ambiente /etc/launchd.conf, da seguinte maneira:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf é executado automaticamente quando você reinicia.

Se você deseja que essas alterações entrem em vigor agora, use este comando para reprocessar launchctl.conf(obrigado @mklement pela dica!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Você pode descobrir mais sobre launchctle como ele carrega launchd.confcom o comando man launchctl.


2
Muito bom! A vantagem de usar o environment.plist parece ser que o OS X honra o conteúdo desses arquivos sem o incômodo de ter que inicializar um terminal primeiro. Enfim, acho que sua resposta concentrou-se principalmente em evitar a necessidade de uma reinicialização, portanto, thx para isso.
— FotNelton 27/09

2
@kapuzineralex Sim, evita uma reinicialização, também altera o ambiente dos programas iniciados no Spotlight, o que environment.plistnão acontece.
— Matt Curtis

2
Definir o ambiente dessa maneira funcionou apenas para mim até que eu reiniciei. A variável de ambiente não durou depois que eu reiniciei o mac. A resposta de Matthew funcionou perfeitamente para mim.
— Shamal Karunarathne

8
@ Shamal: marquei o seu comentário com +1, mas lembre-se de que a resposta de Matthew exige uma reinicialização, enquanto estou apontando a maneira correta de alterá-la sem uma reinicialização. Se você quer os dois, sugiro que você coloque suas configurações de caminho no launchd.conf (para que elas persistam durante a reinicialização) e use um script com algo como "source /etc/launchctl.conf; launchctl setenv PATH $ PATH", para você também pode "atualizar" quando não quiser reiniciar.
— Matt Curtis

5
@MattCurtis Você poderia editar sua resposta diretamente para deixar claro que, embora não seja necessária a reinicialização, as alterações serão realmente perdidas após uma reinicialização? Além disso, a maneira correta de aplicar as alterações em etc/launchd.confantes de uma reinicialização seria usar a abordagem em resposta da @ MatthewMcCullough: egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl.
— mklement0

106

Até e incluindo o OS X v10.7 (Lion), você pode configurá-los em:

~/.MacOSX/environment.plist

Vejo:

Para PATH no Terminal, você deve poder configurá-lo .bash_profileou .profile(provavelmente precisará criá-lo)

Para o OS X v10.8 (Mountain Lion) e além, você precisa usar launchdelaunchctl .


4
Isso é apenas se você realmente espera que eles sejam usados ​​por aplicativos gráficos. Como essas não costumam usar variáveis ​​de ambiente, não é um bom lugar para defini-las.
— Chris Hanson

18
Existem alguns exemplos muito bons de aplicativos gráficos que usam variáveis ​​de ambiente. O IntelliJ, por exemplo, gosta de ver M2_HOME para saber onde Maven mora. Para que ele veja a variável, você precisará configurá-lo em /etc/launchd.conf em vez de environment.plist.
— 26615 Matthew McCullough

3
Para referência: o uso não preferences.plistera o ideal no OS X 10.5, pois na época preferences.plistnão havia sido lido para aplicativos iniciados pelo spotlight, consulte o comentário de Louis à resposta de Matthew e email.esm.psu.edu/pipermail/macosx-emacs/2010- /002113.html . Para o OS X 10.6, environment.plistfunciona exatamente como deveria.
— Janus

16
Isso não é mais aplicável ao OSX 10.8 apple.stackexchange.com/questions/57385/…
— thatsmydoing

1
@tim_yates Você poderia editar a primeira linha da sua resposta para ler "Até e incluindo Leão (10. * 7 *)", considerando que é isso que está correto? Eu tentei fazer essa edição no original, ambíguo "Até o leão da montanha", e os revisores o fizeram mal.
— precisa

67

Solução para aplicativos de linha de comando e GUI de uma única fonte (funciona com o Mac OS X versão 10.10 (Yosemite) e o Mac OS X versão 10.11 (El Capitan))

Vamos supor que você tenha definições de variáveis ​​de ambiente ~/.bash_profilesemelhantes no seguinte trecho:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Precisamos de um agente de inicialização que seja executado em cada login e a qualquer momento, sob demanda, que carregará essas variáveis ​​na sessão do usuário. Também precisaremos de um script de shell para analisar essas definições e criar os comandos necessários a serem executados pelo agente.

Crie um arquivo com plistsufixo (por exemplo, nomeado osx-env-sync.plist) no ~/Library/LaunchAgents/diretório com o seguinte 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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-lparâmetro é crítico aqui; é necessário executar o script de shell com um shell de logon, para que ~/.bash_profileseja originado em primeiro lugar antes da execução desse script.

Agora, o script de shell. Crie-o ~/.osx-env-sync.shcom o seguinte conteúdo:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

Verifique se o script do shell é executável:

chmod +x ~/.osx-env-sync.sh

Agora, carregue o agente de inicialização para a sessão atual:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Re) Inicie um aplicativo GUI e verifique se ele pode ler as variáveis ​​de ambiente.

A instalação é persistente. Ele sobreviverá a reinicializações e logins.

Após a configuração inicial (que você acabou de fazer), se desejar refletir ~/.bash_profilenovamente as alterações no seu ambiente inteiro, launchctl load ...execute novamente o comando não executará o que você deseja; em vez disso, você receberá um aviso como o seguinte:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

Para recarregar suas variáveis ​​de ambiente sem passar pelo processo de logout / login, faça o seguinte:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Finalmente, certifique-se de reiniciar seus aplicativos já em execução (incluindo o Terminal.app) para torná-los cientes das alterações.

Também enviei o código e as explicações aqui para um projeto do GitHub: osx-env-sync .

Espero que essa seja a solução definitiva, pelo menos para as versões mais recentes do OS X (Yosemite e El Capitan).


Funciona bem. Um pouco preocupado se isso se tornou popular se seria uma brecha de segurança
— Warren P

3
Essa solução foi a única que consegui trabalhar corretamente. Ótimas soluções. Eu não posso entender por que isso deve ser tão difícil no mac ...
— JohnyTex

2
Isso não funciona no El Capitan, infelizmente. Seu comentário em github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508 explica bem o problema.
— mgol 20/01

1
Portanto, essa solução não funciona, /etc/launchd.conf não tem efeito, o Node.js instala seu binário em / usr / local / bin e esse caminho não está no PATH para aplicativos de GUI. Portanto, os ganchos Git usando Node não funcionam em aplicativos GUI Git como o SourceTree no El Capitan. Isso é terrível.
— mgol

1
O problema é apenas sobre a variável PATH. Espero que possamos encontrar uma solução em breve.
— precisa saber é o seguinte

54
  1. Faz:

    vim ~/.bash_profile

    O arquivo pode não existir (se não, você pode apenas criá-lo).

  2. Digite isso e salve o arquivo:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Corre

    source ~/.bash_profile

+1 exporté o que eu ia sugerir, desde BASH não suportasetenv
— vol7ron

Funciona por enquanto. Essa coisa toda parece muito mais complicada do que eu pensava. Terá que dedicar um pouco mais de tempo para tudo isso mais tarde. Obrigado.
— Ruto Collins

34

Existem essencialmente dois problemas a serem resolvidos ao lidar com variáveis ​​de ambiente no OS X. O primeiro é ao chamar programas do Spotlight (o ícone da lupa no lado direito do menu / barra de status do Mac) e o segundo ao chamar programas do Dock . Invocando programas a partir de um aplicativo Terminal / utilitário é trivial porque ele lê o ambiente dos locais de shell padrão ( ~/.profile, ~/.bash_profile, ~/.bashrc, etc.)

Ao chamar programas do Dock, use ~/.MacOSX/environment.plist onde o <dict>elemento contém uma sequência de <key>KEY</key><string>theValue</string>elementos.

Ao chamar programas do Spotlight, verifique se o launchd foi configurado com todas as configurações de chave / valor necessárias.

Para resolver os dois problemas simultaneamente, eu uso um item de login (definido através da ferramenta Preferências do Sistema) na minha conta de usuário. O item de login é um script bash que chama uma função lismac do Emacs, embora é claro que é possível usar sua ferramenta de script favorita para realizar a mesma coisa. Essa abordagem tem o benefício adicional de que funciona a qualquer momento e não requer reinicialização, ou seja, é possível editar ~/.profile, executar o item de login em algum shell e ter as alterações visíveis para programas recém-chamados, a partir do Dock ou do Spotlight.

Detalhes:

Item de login: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Função lismac do Emacs: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

NOTA: Esta solução é uma amálgama daqueles que vieram antes de eu adicionar a minha, principalmente a oferecida por Matt Curtis, mas tentei deliberadamente manter minha ~/.bash_profileplataforma de conteúdo independente e colocar a configuração do launchdambiente (um recurso exclusivo para Mac) em um script separado .


20
Uau. Eu não estou dizendo que isso não vai funcionar, mas ... Eu só estou chocado com a complexidade necessária para obter um ambiente consistente no OS X.
— offby1

2
Isso funciona da melhor maneira possível entre todas as soluções que eu já vi na versão 10.9. A única falha é que, como os itens de logon são executados em uma ordem indeterminada, se o Emacs (por exemplo) for iniciado no logon (porque foi aberto no logout, por exemplo), ele não terá necessariamente as variáveis ​​de ambiente, a menos que você o reinicie , porque foi lançado antes do seu script.
— telotortium

22

Outra solução gratuita e de código aberto do Mac OS X v10.8 (Mountain Lion) / environment.plist é o EnvPane .

O código fonte do EnvPane disponível no GitHub . O EnvPane parece ter recursos comparáveis ​​ao RCEnvironment , no entanto, parece que ele pode atualizar suas variáveis ​​armazenadas instantaneamente, ou seja, sem a necessidade de uma reinicialização ou login, o que é bem-vindo.

Conforme declarado pelo desenvolvedor:

O EnvPane é um painel de preferências para o Mac OS X 10.8 (Mountain Lion) que permite definir variáveis ​​de ambiente para todos os programas em sessões gráficas e de terminal. Além de restaurar o suporte para ~ / .MacOSX / environment.plist no Mountain Lion, ele também publica suas alterações no ambiente imediatamente, sem a necessidade de efetuar logoff e logon novamente. <SNIP> O EnvPane inclui (e instala automaticamente) um agente launchd que executa 1) logo após o logon e 2) sempre que o ~ / .MacOSX / environment.plist for alterado. O agente lê ~ / .MacOSX / environment.plist e exporta as variáveis ​​de ambiente desse arquivo para a instância launchd do usuário atual por meio da mesma API usada pelo launchctl setenv e launchctl unsetenv.

Isenção de responsabilidade: não tenho relação alguma com o desenvolvedor ou seu projeto.

PS Eu gosto do nome (soa como 'Ends Pain').


2
O EnvPane não pode definir PATH no momento. Para mais detalhes veja o meu relatório de bug: github.com/hschmidt/EnvPane/issues/5
— Uwe Günther

Eu ♥ ️ essa coisa .. A única desvantagem .. da qual acho que QUALQUER solução será vítima .. é - ter que reiniciar um processo - herdar o novo "ambiente". Wonk wonk.
— Alex Gray

2
@sorin: Você pode abrir um problema no site do GitHub com uma descrição do problema que está ocorrendo? O EnvPane funciona para mim na 10.10. Disclaimer: Eu sou o autor do EnvPane.
— Hannes

17

Atualização (04/08/2017)

A partir do (pelo menos) macOS 10.12.6 (Sierra), esse método parece ter parado de funcionar para o Apache httpd (tanto para systema useropção quanto para launchctl config). Outros programas não parecem ser afetados. É concebível que isso seja um bug no httpd.

Resposta original

Isso se refere ao OS X 10.10+ (10.11+, especificamente devido ao modo sem raiz, onde /usr/binnão é mais gravável).

Eu li em vários lugares que o uso launchctl setenv PATH <new path>para definir a PATHvariável não funciona devido a um bug no OS X (o que parece verdadeiro por experiência pessoal). Descobri que há outra maneira de PATHdefinir aplicativos não lançados a partir do shell :

sudo launchctl config user path <new path>

Esta opção está documentada na página do manual launchctl:

sistema de configuração | valor do parâmetro do usuário

Define informações de configuração persistentes para domínios launchd (8). Somente o domínio do sistema e os domínios do usuário podem ser configurados. O local do armazenamento persistente é um detalhe da implementação e as alterações nesse armazenamento devem ser feitas apenas por meio desse subcomando. É necessária uma reinicialização para que as alterações feitas através deste subcomando entrem em vigor.

[...]

caminho

Define a variável de ambiente PATH para todos os serviços no domínio de destino como o valor da sequência. O valor da string deve estar em conformidade com o formato descrito para a variável de ambiente PATH em environ (7). Observe que, se um serviço especificar seu próprio PATH, a variável de ambiente específica do serviço terá precedência.

NOTA: Este recurso não pode ser usado para definir variáveis ​​de ambiente geral para todos os serviços no domínio. Seu escopo é intencionalmente variável para o ambiente PATH e nada mais por razões de segurança.

Confirmei que isso funciona com um aplicativo GUI iniciado no Finder (que usa getenvpara obter o PATH). Observe que você só precisa fazer isso uma vez e a alteração será persistente durante as reinicializações.


Funciona pra mim também. sudo launchctl procinfo <gui-pid>mostra o PATHambiente recém-definido . Mas sudo launchctl config user path <new path>realmente definir para todos os usuários ... (confirmado pela adição de novo usuário e usando o console python do Sublime texto)
— Bossliaw

1
Isso não parece afetar a variável de ambiente PATH dos aplicativos que são reabertos no logon (que estavam abertos ao desligar).
— Brecht Machiels 08/07/19

Interessante. Isso significaria que, para aplicativos que serão reabertos, o ambiente (ou um subconjunto dele) está sendo salvo.
— precisa

@MaxLeske Não, os aplicativos reabertos estão sendo iniciados antes que a variável de ambiente seja alterada. Então, não é apenas a primeira vez depois de fazer sudo launchctl config user pathisso que acontece (o que você parece estar assumindo?).
— Brecht Machiels

1
@ShlomiSchwartz launchctlque não permitem definir variáveis de ambiente arbitrárias. A PATHvariável é uma exceção.
— precisa saber é o seguinte

17

No Mountain Lion, toda a edição /etc/pathse /etc/launchd.confnão faz nenhum efeito!

Os fóruns de desenvolvedores da Apple dizem:

"Altere a lista Info.pl do próprio .app para conter um dicionário" LSEnvironment "com as variáveis ​​de ambiente que você deseja.

~ / .MacOSX / environment.plist não é mais suportado. "

Então, editei diretamente o aplicativo Info.plist(clique com o botão direito do mouse em "AppName.app" (neste caso, SourceTree) e depois em " Show package contents").

Mostrar conteúdo do pacote

E eu adicionei um novo par de chave / dict chamado:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(consulte: Documentação LaunchServicesKeys na Apple )

Digite a descrição da imagem aqui

Agora o aplicativo (no meu caso Sourcetree) usa o caminho especificado e trabalha com o Git 1.9.3 :-)

PS: É claro que você deve ajustar a entrada Caminho às suas necessidades específicas de caminho.


3
Esta solução atende ao padrão de menos invasivo no sistema. Obrigado.
— John Vance

@ John Vance +1 Totalmente de acordo, as mudanças em todo o sistema são sempre arriscado como Jason T. Miller explica claramente em sua resposta
— rmcsharry

5
Não tem efeito para mim em El Capitan. :(
— mgol 20/01/16

No High Sierra 10.13, se eu modificar o Info.plistarquivo do aplicativo, ele falhará ao carregar:LSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
— kunjbhai

16

Embora as respostas aqui não estejam "erradas", adicionarei outra: nunca faça alterações de variável de ambiente no OS X que afetem "todos os processos", ou mesmo fora do shell, para todos os processos executados interativamente por um determinado usuário.

Na minha experiência, as alterações globais nas variáveis ​​de ambiente, como PATH, para todos os processos, têm ainda mais chances de quebrar as coisas no OS X do que no Windows. Por isso, muitos aplicativos do OS X e outros softwares (incluindo, talvez especialmente os componentes do próprio sistema operacional) dependem das ferramentas de linha de comando do UNIX, e assumem o comportamento das versões dessas ferramentas fornecidas com o sistema, e não necessariamente use caminhos absolutos ao fazer isso (comentários semelhantes se aplicam a bibliotecas carregadas dinamicamente e variáveis ​​de ambiente DYLD_ *). Considere, por exemplo, que as respostas mais bem classificadas para várias perguntas sobre o Stack Overflow sobre a substituição de versões de intérpretes fornecidas pelo OS X, como Python e Ruby, geralmente dizem "não faça isso".

O OS X não é realmente diferente de outros sistemas operacionais do tipo UNIX (por exemplo, Linux, FreeBSD e Solaris) a esse respeito; a razão mais provável pela qual a Apple não fornece uma maneira fácil de fazer isso é porque ela quebra as coisas . Na medida em que o Windows não é tão propenso a esses problemas, isso se deve a duas coisas: (1) o software Windows não tende a confiar nas ferramentas de linha de comando na medida em que o software UNIX o faz; e (2) a Microsoft teve um histórico tão extenso de "problemas com DLL" e problemas de segurança causados ​​por alterações que afetam todos os processos que alteraram o comportamento do carregamento dinâmico nas versões mais recentes do Windows para limitar o impacto das opções de configuração "globais" como PATH.

"Manco" ou não, você terá um sistema muito mais estável se restringir essas alterações a escopos menores.


1
Dizer às pessoas para não fazerem o que pediram não é uma resposta para a pergunta que fizeram. Impedir que as pessoas façam isso também está quebrando as coisas. Modus operandi da Apple.
— frabjous

Definir o PATH em /Applications/App.app/Contents/Info.plist com a chave LSEnvironment developer.apple.com/library/archive/documentation/General/… pode ser a solução recomendada atualmente.
— Dave X

15

Às vezes, todas as respostas anteriores simplesmente não funcionam. Se você deseja ter acesso a uma variável do sistema (como M2_HOME) no Eclipse ou no IntelliJ IDEA, a única coisa que funciona para mim nesse caso é:

Primeiro (etapa 1) edite /etc/launchd.confpara conter uma linha como esta: "setenv VAR value" e depois (etapa 2) reinicie.

Simplesmente modificar .bash_profile não funcionará porque no OS X os aplicativos não são iniciados como em outros Unix; eles não herdam as variáveis ​​de shell do pai. Todas as outras modificações não funcionarão por um motivo desconhecido para mim. Talvez alguém possa esclarecer sobre isso.


5
Os aplicativos iniciados no Spotlight ou por qualquer outro meio têm o /etc/launchd.conf lido pelo processo pai, tornando-o uma opção atraente para definir as variáveis ​​de ambiente visíveis em todos os aplicativos e shells.
— 26615 Matthew McCullough

1
Veja minha resposta para outra solução, que evita uma reinicialização - stackoverflow.com/questions/135688/…
— Matt Curtis

Minha máquina MaxOS 10.6 não possui o arquivo /etc/launchd.conf. Isso é algo novo ou obsoleto nesta versão? Ou esta máquina está bagunçada?
— Peterk

13

Depois de procurar o painel de preferências Variáveis ​​de ambiente e descobrir que o link está quebrado, uma pesquisa no site da Apple parece indicar que eles se esqueceram dele. Comecei a seguir o rastro do processo de inicialização indescritível.

No meu sistema (Mac OS X 10.6.8), parece que as variáveis ​​definidas em environment.plist estão sendo exportadas de maneira confiável para aplicativos iniciados no Spotlight (via launchd). Meu problema é que esses vars não estão sendo exportados para novas sessões do bash no Terminal. Ou seja, eu tenho o problema oposto, como retratado aqui.

NOTA: environment.plist se parece com JSON, não XML, conforme descrito anteriormente

Consegui que os aplicativos Spotlight vissem os vars editando ~ / MacOSX / environment.plist e pude forçar os mesmos vars a uma nova sessão do Terminal adicionando o seguinte ao meu arquivo .profile:

eval $(launchctl export)

2
Não é tão ilusório: RCenvironment
— Gilimanjaro 26/10

Boa dica sobre a exportação launchctl. Mas eu não colocaria isso como está no .profile. Ele substituirá seu $ PATH por um que não inclua / usr / local / bin. Mas você pode usar um regex para selecionar os vars nos quais está interessado: `` eval $ (launchctl export | grep '^ my. * =').
— mivk

3
Na minha nova máquina Mountain Lion (10.8.2), o environment.plist é completamente inútil. Veja a resposta de Mateus para o caminho certo. É tudo sobre o lançamento e o aplicativo de linha de comando launchctl junto com /etc/launchd.conf. Você pode ler-se a si mesmo com man launchd, man launchctle man launchd.confem uma janela de terminal. Ainda bem que a Apple mantém as páginas de manual atualizadas, mesmo que a Biblioteca do Desenvolvedor Mac fique um pouco atrasada.
— Russell B

10

Qualquer um dos arquivos da festança de arranque - ~/.bashrc, ~/.bash_profile, ~/.profile. Há também algum tipo de arquivo estranho nomeado ~/.MacOSX/environment.plistpara variáveis ​​de ambiente nos aplicativos GUI.


10

Assim como a resposta que Matt Curtis deu, eu defino variáveis ​​de ambiente via launchctl, mas a envolvo em uma função chamada export, de modo que sempre que exporto uma variável como normal no meu .bash_profile, ela também é definida pelo launchctl. Aqui está o que eu faço:

  1. Meu .bash_profile consiste apenas de uma linha (esta é apenas uma preferência pessoal).

    source .bashrc
  2. Meu .bashrc tem isso:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. O procedimento acima sobrecarregará a "exportação" interna do Bash e exportará tudo normalmente (você notará que eu exporto "exportação" com ela!) E, em seguida, defina-as adequadamente para ambientes de aplicativos OS X via launchctl, se você usa qualquer um dos seguintes:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. Dessa forma, não preciso enviar todas as variáveis ​​para o launchctl todas as vezes e posso apenas ter meu .bash_profile / .bashrc configurado da maneira que desejar. Abra uma janela do terminal, verifique as variáveis ​​de ambiente em que você está interessado launchctl getenv myVar, altere algo em seu .bash_profile / .bashrc, feche a janela do terminal e abra-a novamente, verifique a variável novamente com o launchctl, e pronto, isso mudou.

  5. Novamente, como as outras soluções para o mundo pós-Mountain Lion, para que novas variáveis ​​de ambiente estejam disponíveis para aplicativos, é necessário iniciá-las ou reiniciá-las após a alteração.


1
Resposta útil - obrigado. Acabei de atualizá-lo porque sua solução original não lidava com casos em que o valor da variável de ambiente que você estava configurando tinha sinais de igual (por exemplo, CXX_FLAGS = "- mmacosx-version-min = 10.9"
— Steve Broberg

@SteveBroberg - apenas uma alteração de um personagem corrige o regexp do Bash sem precisar do sed! (Não me interpretem mal, eu adoro sed, mas isso funciona e é muito mais curto.)
— courtlandj

1
Eu percebi que tinha que haver uma maneira melhor, mas eu não sou um guru bash, e eu não poderia google o que %%, ## foram, etc.
— Steve Broberg

10

Aqui está uma maneira muito simples de fazer o que você deseja. No meu caso, estava fazendo o Gradle funcionar (para o Android Studio).

  • Abra o Terminal.
  • Execute o seguinte comando:

    sudo nano /etc/paths ou sudo vim /etc/paths

  • Digite sua senha, quando solicitado.

  • Vá para a parte inferior do arquivo e digite o caminho que você deseja adicionar.
  • Pressione Control+ Xpara sair.
  • Digite 'Y' para salvar o buffer modificado.
  • Abra uma nova janela do terminal e digite:

    echo $PATH

Você deve ver o novo caminho anexado ao final do PATH.

Eu recebi esses detalhes deste post:

Adicione ao PATH no Mac OS X 10.8 Mountain Lion e acima



7

Para ser conciso e claro sobre o objetivo de cada arquivo

  • ~/.profile é fornecido sempre que o Terminal.app é iniciado
  • ~/.bashrc é onde "tradicionalmente" todas as instruções de exportação para o ambiente Bash são definidas
  • /etc/paths é o arquivo principal no Mac OS que contém a lista de caminhos padrão para criar a variável de ambiente PATH para todos os usuários
  • /etc/paths.d/ contém arquivos que contêm caminhos de pesquisa adicionais

Os programas não terminais não herdam as variáveis ​​PATH e MANPATH em todo o sistema que o seu terminal faz! Para definir o ambiente para todos os processos iniciados por um usuário específico, disponibilizando variáveis ​​de ambiente para aplicativos da interface gráfica do usuário do Mac OS X, essas variáveis ​​devem ser definidas no seu~/.MacOSX/environment.plist (Apple Technical Q&A QA1067)

Use a seguinte linha de comando para sincronizar environment.plistcom /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"

6

O /etc/launchd.conf não é usado no OS X v10.10 (Yosemite), no OS X v10.11 (El Capitan), no macOS v10.12 (Sierra) ou no macOS v10.13 (High Sierra).


Na launchctlpágina do manual:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

O método descrito nesta resposta Perguntar a diferentes funciona para mim (após uma reinicialização): os aplicativos iniciados no Dock ou no Spotlight herdam as variáveis ​​de ambiente definidas por mim ~/Library/LaunchAgents/my.startup.plist. (No meu caso, eu precisava definir LANG, para en_US.UTF-8, um plug-in Sublime Text.)


Na reinicialização, há uma ordem de carregamento que garante que o my.startup.plist teria sido carregado antes dos aplicativos da última sessão serem reiniciados?
— kunjbhai


3

É simples:

Edite ~ / .profile e coloque suas variáveis ​​da seguinte maneira

$ vim ~ / .profile

No arquivo colocado:

MY_ENV_VAR = valor

  1. Salvar (: wq)

  2. Reinicie o terminal (saia e abra-o novamente)

  3. Certifique-se de que tudo esteja bem:

$ echo $ MY_ENV_VAR

$ value



3

Para uma única modificação do usuário, use ~/.profileos que você listou. O link a seguir explica quando os diferentes arquivos são lidos pelo Bash.

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

Se você deseja definir a variável de ambiente para aplicativos da GUI, precisa do arquivo ~ / .MacOSX / environment.plist


3

Bem, não tenho certeza sobre os arquivos /etc/pathse ~/.MacOSX/environment.plist. Esses são novos.

Mas com o Bash, você deve saber que .bashrcé executado a cada nova chamada de shell e .bash_profileé executado apenas uma vez na inicialização.

Não sei com que frequência isso ocorre no Mac OS X. Acho que a distinção foi quebrada com o sistema de janelas lançando tudo.

Pessoalmente, elimino a confusão criando um .bashrcarquivo com tudo o que preciso e depois faço:

ln -s .bashrc .bash_profile

3

Uma coisa a ser observada, além das abordagens sugeridas, é que, pelo menos no OS X 10.5 (Leopard), as variáveis ​​definidas launchd.confserão mescladas com as configurações feitas no .profile. Suponho que provavelmente também seja válido para as configurações ~/.MacOSX/environment.plist, mas não o verifiquei.


3

Configure sua variável de ambiente PATH no Mac OS

Abra o programa Terminal (isso está na sua pasta Aplicativos / Utilitários por padrão). Execute o seguinte comando

touch ~/.bash_profile; open ~/.bash_profile

Isso abrirá o arquivo no seu editor de texto padrão.

Para Android SDK como exemplo:

Você precisa adicionar o caminho ao diretório de ferramentas e ferramentas da plataforma SDK do Android. No meu exemplo, usarei "/ Development / android-sdk-macosx" como o diretório em que o SDK está instalado. Adicione a seguinte linha:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Salve o arquivo e feche o editor de texto. Execute seu .bash_profile para atualizar seu PATH:

source ~/.bash_profile

Agora, toda vez que você abrir o programa Terminal, seu PATH incluirá o Android SDK.


3

Só fiz isso muito fácil e rápido. Primeiro crie um ~ / .bash_profile a partir do terminal:

touch .bash_profile

então

open -a TextEdit.app .bash_profile

adicionar

export TOMCAT_HOME=/Library/Tomcat/Home

salve o documento e pronto.


Perfecto. Eu segui as etapas para JAVA_HOME, Acabei de adicionar a exportação JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contents / Página inicial e real sucesso rápido!
— NarendraC

Great @NarendraC!
— CodeOverRide 18/02/19

2

É bem simples Edite o arquivo .profile(vi, nano , Sublime Text ou outro editor de texto). Você pode encontrá-lo no ~/diretório (diretório do usuário) e definir assim:

export MY_VAR=[your value here]

Exemplo com Java home:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Salve-o e retorne ao terminal.

Você pode recarregá-lo com:

source .profile

Ou feche e abra a janela do seu terminal.


2

Existem dois tipos de conchas em jogo aqui.

  • Sem login: .bashrc é recarregado toda vez que você inicia uma nova cópia do Bash
  • Login: o .profile é carregado apenas quando você faz o login ou instrui explicitamente o Bash para carregá-lo e usá-lo como um shell de login.

É importante entender aqui que com Bash, arquivo .bashrcé somente leitura por um escudo que é tanto interativo e não-login, e você vai achar que as pessoas muitas vezes carregar .bashrcem.bash_profile superar esta limitação.

Agora que você tem o entendimento básico, vamos seguir como eu aconselho você a configurá-lo.

  • .profile: crie-o inexistente. Coloque sua configuração PATH lá.
  • .bashrc: crie se não existir. Coloque todos os seus aliases e métodos personalizados lá.
  • .bash_profile: crie se não existir. Coloque o seguinte lá.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

2

Conchas de login

/etc/profile

O shell primeiro executa os comandos no arquivo /etc/profile. Um usuário que trabalha com privilégios de root pode configurar esse arquivo para estabelecer características padrão em todo o sistema para usuários que executam o Bash.

.bash_profile
.bash_login
.profile

Em seguida a aparência de casca para ~/.bash_profile, ~/.bash_logine ~/.profile(~ / é mão curto para o seu diretório home), nessa ordem, executar os comandos no primeiro desses arquivos que encontrar. Você pode colocar comandos em um desses arquivos para substituir os padrões definidos /etc/profile. Um shell em execução em um terminal virtual não executa comandos nesses arquivos.

.bash_logout

Quando você efetua logout, o bash executa comandos no ~/.bash_logoutarquivo. Esse arquivo geralmente contém comandos que são limpos após uma sessão, como aqueles que removem arquivos temporários.

Cascas interativas sem registro

/etc/bashrc

Embora não seja chamado diretamente pelo bash, muitos ~/.bashrcarquivos são chamados /etc/bashrc. Essa configuração permite que um usuário que trabalha com privilégios de root estabeleça características padrão em todo o sistema para shells bash sem logon.

.bashrc

Um shell interativo sem logon executa comandos no ~/.bashrcarquivo. Normalmente, um arquivo de inicialização para um shell de logon, como .bash_profile, executa esse arquivo, portanto, os shells de logon e não logon executam os comandos .bashrc.

Como os comandos in .bashrcpodem ser executados muitas vezes e como os subshells herdam variáveis ​​exportadas, é uma boa ideia colocar comandos que sejam adicionados às variáveis ​​existentes no .bash_profilearquivo.


2

Toda a mágica no iOS só é usada sourcecom o arquivo, para o qual você exporta suas variáveis ​​de ambiente.

Por exemplo:

Você pode criar um arquivo como este:

export bim=fooo
export bom=bar

Salve este arquivo como bimbom.enve faça source ./bimbom.ev. Voilá, você tem suas variáveis ​​de ambiente.

Verifique-os com:

echo $bim

1

Para o Bash, tente adicionar suas variáveis ​​de ambiente ao arquivo /etc/profilepara torná-las disponíveis para todos os usuários. Não há necessidade de reiniciar, basta iniciar uma nova sessão do Terminal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.