Como o Mac OS X define o valor de $ PATH?

10

Eu tenho um entendimento básico sobre como o $ PATH pode ser definido, mas existe uma documentação que descreva completamente onde o Mac OS obtém todos os caminhos que são anexados ao $ PATH? Estou ciente de coisas como /etc/profile , /etc/paths e /etc/profile.d , mas existem outros scripts que eventualmente afetam o valor de $ PATH? Também não estou muito familiarizado entre os shells de não-login e de login ( .bashrc , .bash_profile ), mas estou ciente das diferenças básicas.

    
por Psycho Punch 03.10.2013 / 12:37

2 respostas

9

Normalmente, o seu PATH é definido pelo shell. Para o Bash, tudo é explicado no manual . Você também pode abrir man bash e pular para a parte INVOCATION .

Invoked as an interactive login shell, or with --login

When Bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.

Invoked as an interactive non-login shell

When an interactive shell that is not a login shell is started, Bash reads and executes commands from ~/.bashrc, if that file exists. In OS X, additionally, there is path_helper which reads the contents of /etc/paths.d and appends those to your path.

A chave aqui é que, no OS X, o Terminal abre um shell de login por padrão, enquanto no Linux, os shells geralmente são iniciados como shells não-login. Josh Staiger tem uma boa explicação do login vs shells não-login .

Portanto, há essencialmente apenas esses dois três nos quais você pode definir caminhos:

  • /etc/profile (que chama path_helper )
  • /etc/paths e /etc/paths.d (chamado de path_helper )
  • seu arquivo de configuração do shell ( .bash_profile )
por 03.10.2013 / 13:03
7

Os caminhos em /etc/paths e /etc/paths.d/* são normalmente adicionados a PATH por path_helper . path_helper é executado a partir de /etc/profile , portanto, ele é executado quando o bash é chamado como um shell de login interativo, mas não quando o bash é chamado como um shell de não-login ou um shell não interativo.

/etc/paths contém /usr/local/bin no final por padrão e /etc/paths.d/ está vazio por padrão.

Terminal e iTerm 2 abrem novos shells como shells de login por padrão, e o shell aberto quando você ssh para o seu computador também é um shell de login. Muitos emuladores de terminal em outras plataformas, tmux , e o modo shell no Emacs abrem novos shells como shells que não são de login.

Eu adicionei esta linha a /etc/launchd.conf :

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Altera o valor de PATH do processo de inicialização de raiz. O valor é herdado por todos os outros processos, incluindo processos launchd por usuário. Você pode aplicar alterações a /etc/launchd.conf reiniciando ou executando launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.conf e reiniciando processos.

No OS X, ~/.profile não é lido quando você faz login graficamente. Se os dois ~/.bash_profile e ~/.profile existirem, o bash também não lerá ~/.profile .

~/.MacOSX/environment.plist parou de funcionar em 10.8.

    
por 03.10.2013 / 19:49