Como defino a variável de ambiente PATH global no OS X?

101

Gostaria de acrescentar à variável de ambiente PATH global no OS X para que todos os shells de usuário e aplicativos de GUI obtenham o mesmo ambiente PATH.

Eu sei que posso acrescentar o caminho nos scripts de inicialização do shell, mas essas configurações não são herdadas pelos aplicativos da GUI.

A única maneira que encontrei até agora é redefinir a variável de ambiente PATH no /etc/launchd.conf :

setenv PATH /usr/bin:/bin:/usr/sbin:/sbin:/my/path

Eu não conseguia descobrir uma maneira de realmente adicionar ao PATH launchd.conf.

Estou um pouco preocupado com esse método, mas até agora essa é a única coisa que funciona. Existe uma maneira melhor?

lajos
fonte
2
Para Yosemite e
versões
Nenhuma das respostas aqui aborda a pergunta do OP. Mas o comentário aqui da thSoft está certo! Talvez isso deve ser fundidos ou ligados a essa pergunta referenciada: stackoverflow.com/questions/25385934/...
Kevin Buchs

Respostas:

71

As informações da GUI do palmer estão corretas, mas há uma maneira mais sustentável de modificar o caminho visto pelo shell. Como o mediaslave disse , você pode editar /etc/paths, mas ainda melhor, você pode soltar um arquivo de texto /etc/paths.d/com um caminho e todas as conchas irão construir o caminho corretamente.

Por exemplo, no meu sistema:

$ cat /etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
$ ls /etc/paths.d
X11       git      postgres
$ cat /etc/paths.d/postgres
/Library/PostgreSQL/8.4/bin
$ echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/Library/PostgreSQL/8.4/bin:/usr/X11/bin:/usr/local/mysql/bin
cogg
fonte
1
Bom obrigado! Nota: isso requer que você efetue logout e logon novamente antes que funcione.
weronika
@weronika: Eu achei que era suficiente sair e relançar X11(menos doloroso do que sair completamente). Eu não tentei Terminal.
22613 Peter Gluck
Eu estava me referindo ao Terminal - você está certo, esqueci de especificar.
weronika
8
É bom saber, mas NÃO responde à pergunta do OP, pois esse mecanismo não se aplica aos aplicativos GUI. O OP estava procurando uma solução unificada que lhe permitisse anexar ao padrão $PATH.
mklement 31/05
o que você quer dizer com "meu sistema" aqui, @cogg? Não estamos todos usando o OS X aqui? Desculpe, mas ainda sou novo no OS X. Estou usando o OS X 10.7
ericn
48

/etc/launchd.conf

O launchd.confarquivo é ** a única solução completa que funcionará para aplicativos de linha de comando e GUI no OS X v10.8 (Mountain Lion) e v10.9 (Mavericks), que funcionará com aplicativos de console e GUI para todos os usuários .

sudo touch /etc/launchd.conf
sudo nano /etc/launchd.conf

Adicionar, acrescentar

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

No exemplo acima, adicionei /usr/local/binaos valores de ambiente padrão para PATH.

Lembre-se de que este arquivo não é um script e você não tem a opção de usar substituições. Além disso, para aplicá-las, é necessário reiniciar.

Lembre-se, todos os outros são apenas soluções parciais:

  • environment.plist não funciona para aplicativos lançados via Spotlight.
  • /etc/paths - apenas para console
  • /etc/csh.cshrcou /etc/bashrc- apenas para algumas conchas

Esta resposta é baseada sobre a mesma questão a partir Definir variáveis de ambiente no Mac OS X .

sorin
fonte
7
Ótima descoberta, mas a pergunta já fala sobre o launchd e está perguntando como anexar ao caminho.
cregox
21
Você realmente adicionou um comentário à pergunta original apontando para si mesmo como "a resposta real"?
TJ Luoma
7
Está implícito na sua resposta - útil -, mas apenas para esclarecer: o desejo do OP de anexar ao caminho padrão não é suportado, porque você não pode fazer referência a outras variáveis ​​de ambiente /etc/launchd.conf.
mklement 31/05
Não é global - o ambiente de linha de comando irá descartar este quando / etc / profile chama path_helper e reconstrói PATH do / etc / caminhos e /etc/paths.d/
Dave X
1
de acordo com apple.stackexchange.com/questions/106355/... , esta sem longas obras para Yosemite ou mais tarde
ericn
7

Você precisará configurá-lo shell a shell; Os shell Bash e csh-like não compartilham os mesmos arquivos de configuração e sintaxe para ajustar o PATH.

Tentar fazer isso launchctlnão funcionará, porque as variáveis ​​de ambiente são definidas no login; eles não existem em todo o sistema no Unix fora de uma sessão de shell.

Então você vai querer adicionar

setenv PATH "$PATH:/add/my/extra/path"

para /etc/csh.cshrce

export PATH="$PATH:/more/paths:/

para /etc/bashrc.

Se você deseja variáveis ​​de ambiente em aplicativos GUI, isso é mais complicado. Você precisa criar um .MacOSX/environment.plistarquivo no diretório inicial de cada usuário. O .MacOSXdiretório provavelmente não existirá por padrão, então você terá que criá-lo.

O formato do arquivo é assim:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

    <key>PRINTER</key>
    <string>myprinter</string>

    <key>PATH</key>
    <string>/path/to/thing/I/need</string>

    <key>DISPLAY</key>
    <string>0:1</string>

</dict>
</plist>

Mais informações no environment.plist site da Apple .

mais palmer
fonte
Mas as configurações entram em vigor quando definidas no /etc/launchd.conf ... Hmmm ... / me está confuso.
Xerxes
Realmente? Qual variável de ambiente você está definindo lá?
palmer
1
Apenas uma atualização a partir do OS X 10.8: a ~/.MacOSX/environment.plistabordagem não é mais suportada e não há substituto no nível do usuário. Você pode usar todo o sistema /etc/launchd.conf(e há uma solução por - *. App).
mklement 31/05
Não responde às perguntas do OP.
precisa
3

Você pode editar seu caminho global adicionando linhas a /etc/paths, um caminho por linha.

sudo nano /etc/paths deveria levá-lo até lá.

manumoomoo
fonte
2
É bom saber, mas não responde à pergunta do OP, pois esse mecanismo não se aplica aos aplicativos GUI.
mklement 31/05
1

Você já viu a página de manual do path_helperutilitário de linha de comando no OS X? Respondi a uma pergunta um pouco relacionada ao SO que acho que você pode achar útil.

ayaz
fonte
1

Não tenho certeza se alguém abordou a maneira mais simples e elegante . Pelo menos no Mac OS X 10.6 (Snow Leopard).

Mexer com o [/etc/|~/.]de [profile|bashrc]arquivos podem funcionar, mas é um pouco de um hack. O /etc/paths.d/diretório é o caminho a seguir:

  • Sudo no seu editor favorito.
  • Crie um novo arquivo chamado *name*(apenas não o nome que já existe) /etc/paths.d/com um caminho por linha:

    /usr/X11/bin
    /Developer/usr/bin
    
  • Então adicione

    eval '/usr/libexec/path_helper -s`
    

    para profileou bashrc, e você deve estar pronto para ir.

noboomu
fonte
1
É bom saber, mas não responde à pergunta do OP, pois esse mecanismo não se aplica aos aplicativos GUI.
mklement 31/05
O nome do arquivo é literalmente *name*? Ou você quer dizer apenas name?
Peter Mortensen
0

Não tenho certeza se o launchd aceita isso, mas tente:

setenv PATH "$ PATH: / meu / caminho"
gravidade
fonte
1
Infelizmente isso não funciona. Não parece que o launchctl tenha acesso a variáveis ​​de ambiente tão fáceis. Existe um comando para obter variáveis ​​de ambiente, mas não há absolutamente nenhuma documentação sobre como usá-lo.
Lajos
0

Não sei por que você usaria /etc/launchd.conf, ao contrário /etc/profile- mas não sou especialista em Mac OS X - acredito em você que tenho certeza de que funciona, mas launchdé a implementação / substituição do Mac OS X para init- Mac OS X me confunde.

De qualquer forma, setenv PATH "$PATH:/more/paths:/and/more/paths"funcionará (tcsh), e o equivalente do shell de bourn é export PATH="$PATH:/more/paths:/and/more/paths"- também não tenho idéia de como launchdestá relacionado a um shell em particular.

Acho que fiz mais perguntas do que respondi =)

Xerxes
fonte
4
As configurações de caminho do / etc / profile não são vistas por nenhum aplicativo OS X GUI. Isso se aplica apenas ao bash. Quero que todos os aplicativos obtenham a nova configuração de caminho.
Lajos
1
Unix? Claro, é unix. Quero dizer, meio que. Sim, nós quebramos coisas que funcionaram por 30 anos, mas ainda é unix! / sigh
Matt Simmons