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).

Paul Wicks
fonte
env "switch.1.disabled=true" open -n /Applications/Eclipse.app/para iniciar o aplicativo GUI com um novo ambiente de sistema definido.
Hong
Veja também: stackoverflow.com/questions/25385934/…
ThomasR 6/17/17

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.

Matthew McCullough
fonte
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.

Matt Curtis
fonte
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 .

tim_yates
fonte
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).

Ersin Er
fonte
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
WoooHaaaa
fonte
+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 .

pajato0
fonte
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').

Big Rich
fonte
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.

Max Leske
fonte
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.

Flori
fonte
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.

Jason T. Miller
fonte
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.

Bruno Ranschaert
fonte
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)
Russell B
fonte
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.

John Millikin
fonte
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.

courtlandj
fonte
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

wired00
fonte
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)"
Claudio Floreani
fonte
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.)

David
fonte
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
5

A $PATHvariável também está sujeita path_helper, que por sua vez utiliza o /etc/pathsarquivo e os arquivos em/etc/paths.d .

Uma descrição mais completa pode ser encontrada em PATH e outros problemas ambientais no Leopard (2008-11).

Nicolas Wu
fonte
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


Fernando Martínez
fonte
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

mmaibaum
fonte
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
mike511
fonte
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.

MiB
fonte
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.

Charaf JRA
fonte
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.

CodeOverRide
fonte
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.

francois.robert
fonte
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
#
ZOXIS
fonte
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.

Koray Tugay
fonte
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
suther
fonte
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.

Rabi
fonte