macos - ver - variavel de ambiente ios




Configurando Variáveis de Ambiente no OS X (20)

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

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

  • / etc / paths
  • ~ / .profile
  • ~ / .tcshrc

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

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


Como definir o ambiente para novos processos iniciados pelo Spotlight (sem precisar reinicializar)

Você pode definir o ambiente usado pelo launchd (e, por extensão, qualquer coisa iniciada pelo 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ê quiser configurar seu caminho em .bashrc ou similar, faça com que seja espelhado no launchd:

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

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

Isto inclui quaisquer shells já rodando sob o Terminal.app, embora se você estiver lá você pode configurar o ambiente mais diretamente, ex: com export PATH=/opt/local/bin:/opt/local/sbin:$PATH para bash ou zsh .

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

Para manter as alterações após uma reinicialização, você pode definir as variáveis ​​de ambiente em /etc/launchd.conf , assim:

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

launchd.conf é executado automaticamente quando você reinicia.

Se você quiser que essas mudanças entrem em vigor agora, você deve usar este comando para reprocessar o launchctl.conf (obrigado @mklement pela dica!)

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

Você pode descobrir mais sobre o launchctl e como ele carrega o launchd.conf com o comando man launchctl .


Solução para aplicativos de linha de comando e GUI de uma única fonte (funciona com o Yosemite & El Capitan)

Vamos supor que você tenha definições de variáveis ​​de ambiente em seu ~/.bash_profile como no snippet a seguir:

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 será executado em cada login e a qualquer momento sob demanda que carregará essas variáveis ​​para a sessão do usuário. Também precisaremos de um script de shell para analisar essas definições e criar comandos necessários para serem executados pelo agente.

Crie um arquivo com sufixo plist (por exemplo, osx-env-sync.plist ) no diretório ~/Library/LaunchAgents/ 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>

-l parâmetro é fundamental aqui; é necessário para executar o script de shell com um shell de login para que o ~/.bash_profile seja originado antes que este script seja executado.

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

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

Certifique-se de que o script de shell seja executável:

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

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

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

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

A configuração é persistente. Ele sobreviverá a reinicializações e relogins.

Após a configuração inicial (que você acabou de fazer), se você quiser refletir quaisquer alterações em seu ~/.bash_profile em todo o seu ambiente novamente, executando novamente o comando launchctl load ... 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.

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

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


Configure sua variável de ambiente PATH no Mac OS

Abra o programa Terminal (isto é, na pasta Aplicativos / Utilitários por padrão). Execute o seguinte comando, toque em ~ / .bash_profile; open ~ / .bash_profile Isto irá abrir o arquivo no seu editor de texto padrão.

Para o ANDROID SDK como exemplo:

Você precisa adicionar o caminho para o diretório de ferramentas e ferramentas da plataforma Android SDK. 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 saia do editor de texto. Execute seu .bash_profile para atualizar seu PATH.

source ~/.bash_profile

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


Atualização (2017-08-04)

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

Resposta original

Isso diz respeito ao OS X 10.10+ (10.11+ especificamente devido ao modo sem raiz, onde /usr/bin não é mais gravável).

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

sudo launchctl config user path <new path>

Esta opção está documentada na página man 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. A localização do armazenamento persistente é um detalhe de implementação e as alterações nesse armazenamento só devem ser feitas por meio desse subcomando. Uma reinicialização é necessária para que as alterações feitas por meio desse subcomando entrem em vigor.

[...]

caminho

Define a variável de ambiente PATH para todos os serviços dentro do domínio de destino para o valor da cadeia. O valor da string deve estar de acordo com o formato descrito para a variável de ambiente PATH no 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 gerais para todos os serviços dentro do domínio. É intencionalmente direcionado para a variável do ambiente PATH e nada mais por motivos de segurança.

Eu confirmei isso para trabalhar com um aplicativo GUI iniciado a partir do Finder (que usa getenv para obter o PATH). Observe que você só precisa fazer isso uma vez e a alteração será persistente durante as reinicializações.


1

vim ~/.bash_profile

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

2.type neste e salve o arquivo:

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile

Assim como a resposta de Matt Curtis, eu defini as variáveis ​​de ambiente via launchctl, mas o envolvo em uma função chamada export, para que sempre que exportar uma variável como normal no meu .bash_profile, ela também seja definida por launchctl. Aqui está o que eu faço:

  1. Meu .bash_profile consiste unicamente em uma linha, (isso é apenas preferência pessoal).

    source .bashrc
  2. Meu .bashrc tem isso:

    function export()
    {
        builtin export "[email protected]"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${[email protected]}"
        fi
    }
    
    export -f export
  3. O acima irá sobrecarregar o Bash embutido "export" e irá exportar tudo normalmente (você notará que eu exporto "export" com ele!), Então configure-os corretamente para ambientes de aplicativos OS X via launchctl, se você usar 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 configurar meu .bash_profile / .bashrc da maneira que desejo.Abra uma janela de terminal, verifique suas variáveis ​​de ambiente com as quais você está interessado launchctl getenv myVar, altere algo em seu .bash_profile / .bashrc, feche a janela do terminal e reabra-a, verifique a variável novamente com launchctl e voilá, ela foi alterada.

  5. Novamente, como as outras soluções para o mundo pós-Mountain Lion, para que qualquer nova variável de ambiente esteja disponível para aplicativos, é necessário iniciá-las ou reativá-las após a alteração.


Depois de perseguir o painel de preferências Variáveis ​​de Ambiente e descobrir que o link está quebrado e uma pesquisa no site da Apple parece indicar que eles se esqueceram disso ... Eu comecei a voltar ao 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 forma confiável para aplicativos lançados do Spotlight (via launchd). Meu problema é que essas versões não estão sendo exportadas para novas sessões de bash no Terminal. Ou seja, eu tenho o problema oposto, como retratado aqui.

NOTA: environment.plist parece JSON, não XML, como descrito anteriormente

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

eval $(launchctl export)

Embora as respostas aqui não estejam "erradas", adicionarei outra: nunca faça mudanças de variáveis ​​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 mudanças globais em variáveis ​​de ambiente como o PATH para todos os processos têm maior probabilidade de quebrar as coisas no OS X do que no Windows. Razão de ser, muitos aplicativos do OS X e outros softwares (incluindo, talvez especialmente, componentes do próprio SO) 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 use necessariamente caminhos absolutos ao fazer isso (comentários semelhantes se aplicam a bibliotecas dinamicamente carregadas e variáveis ​​de ambiente DYLD_ *). Considere, por exemplo, que as respostas mais bem classificadas a várias perguntas do sobre como substituir versões de intérpretes fornecidas pelo OS X, como Python e Ruby, geralmente dizem "não faça isso".

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

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


No Mountain Lion, todas as edições /etc/paths e /etc/launchd.conf não /etc/launchd.conf efeito algum!

Fóruns de desenvolvimento da Apple dizem:

"Altere o Info.plist do próprio .app para conter um dicionário" LSEnvironment "com as variáveis ​​de ambiente desejadas.

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

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

e adicionou um novo par 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-[email protected]/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 )

agora o App (no meu caso SourceTree) usa o caminho dado e funciona com o git 1.9.3 :-)

PS: Claro que você tem que ajustar a entrada do caminho para suas necessidades específicas de caminho.


Outra solução livre, opensource, Mac OSX Mountain Lion (10.8) Painel de preferências / environment.plist é EnvPane .

O código fonte do EnvPane está disponível no Github . O EnvPane parece ter recursos comparáveis ​​ao RCEnvironment , no entanto, parece que pode atualizar suas variáveis ​​armazenadas instantaneamente, ou seja, sem a necessidade de um reinício ou login, o que é bem-vindo.

Como afirmado pelo desenvolvedor:

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 nas sessões gráficas e de terminal. Ele não apenas restaura o suporte para ~ / .MacOSX / environment.plist no Mountain Lion, como também publica suas alterações no ambiente imediatamente, sem a necessidade de efetuar logout e login.
<SNIP>
O EnvPane inclui (e instala automaticamente) um agente launchd que é executado 1) logo após o login e 2) sempre que o ~ / .MacOSX / environment.plist é 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 por launchctl setenv e launchctl unsetenv.

Disclaimer: Eu não estou de forma alguma relacionado ao desenvolvedor ou ao seu projeto.

PS Eu gosto do nome (soa como 'Termina a dor').


É muito simples, edite o arquivo .profile (vi, nano, sublimeText ou outro editor de texto), você pode encontrá-lo no diretório ~ / (diretório do usuário) e configurar 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 / abra sua janela de terminal.


É simples:

Edite ~ / .profile e coloque suas variáveis ​​como segue

$ vim ~ / .profile

Em arquivo colocado:

MY_ENV_VAR = value

  1. Salvar (: wq)

  2. Reinicie o terminal (Saia e abra novamente)

  3. Certifique-se de que tudo esteja bem:

$ echo $ MY_ENV_VAR

valor $


Shell de Login

/etc/profile

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

.bash_profile 
.bash_login 
.profile

Em seguida, o shell procura por ~ / .bash_profile, ~ / .bash_login e ~ / .profile (~ / é breve para o seu diretório pessoal), nessa ordem, executando os comandos no primeiro desses arquivos que encontrar. Você pode colocar comandos em um desses arquivos para sobrescrever os padrões definidos em / 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 arquivo ~ / .bash_logout. Esse arquivo geralmente contém comandos que são limpos após uma sessão, como aqueles que removem arquivos temporários.

Conchas Interativas Nonlogin

/etc/bashrc

Embora não seja chamado pelo bash diretamente, muitos arquivos ~ / .bashrc chamam o / etc / bashrc. Essa configuração permite que um usuário que trabalhe com privilégios de root estabeleça características padrão do sistema para shells bash de não-logon.

.bashrc

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

Como os comandos em .bashrc podem ser executados muitas vezes, e como os subshells herdam variáveis ​​exportadas, é uma boa idéia colocar comandos que sejam adicionados a variáveis ​​existentes no arquivo .bash_profile.



Para ser conciso e claro sobre a finalidade de cada arquivo

  • ~/.profile é originado toda vez que o Terminal.app é lançado
  • ~/.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

Programas não-terminais não herdam as variáveis ​​PATH e MANPATH do sistema que seu terminal faz! Para definir o ambiente para todos os processos iniciados por um usuário específico, tornando as variáveis ​​de ambiente disponíveis para aplicativos GUI do Mac OS X, essas variáveis ​​devem ser definidas em seu ~/.MacOSX/environment.plist(Perguntas e respostas técnicas da Apple QA1067)

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

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

Apenas fiz isso muito fácil e rápido. Primeiro crie um ~ / .bash_profile no terminal:

touch .bash_profile

então

open -a TextEdit.app .bash_profile

adicionar

export TOMCAT_HOME=/Library/Tomcat/Home

salvar documement e está feito.


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

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

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

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

ln -s .bashrc .bash_profile

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.


Todo o Magic no IOS só vai com o uso sourcedo arquivo, onde você exporta suas Variáveis ​​ENV.

Por exemplo:

Você pode criar um arquivo como este:

export bim=fooo
export bom=bar

Salve este arquivo como bimbom.env, e faça o source ./bimbom.evVoilá, você tem suas Variáveis ​​ENV.

Verifique com: echo $bim


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





environment-variables