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

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

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

Responder1

Normalmente, seu PATH é definido pelo shell. Para Bash, tudo éexplicado no manual. Você também pode abrir man bashe pular para a INVOCATIONparte.

Invocado como um shell de login interativo ou com --login

Quando o Bash é invocado como um shell de login interativo ou como um shell não interativo com a opção --login, ele primeiro lê e executa comandos do arquivo /etc/profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~/.bash_profile, ~/.bash_login e ~/.profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível.

Invocado como um shell interativo sem login

Quando um shell interativo que não é um shell de login é iniciado, o Bash lê e executa comandos de ~/.bashrc, se esse arquivo existir. No OS X, além disso, hápath_helperque lê o conteúdo /etc/paths.de o anexa ao seu caminho.

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 sem login. Josh Staiger temuma boa explicação sobre shells de login versus shells sem login.

Portanto, existem essencialmente apenas estes dois onde você pode definir caminhos:

  • /etc/profile(que chama path_helper)
  • /etc/pathse /etc/paths.d(chamado de path_helper)
  • seu arquivo de configuração do shell ( .bash_profile)

Responder2

Os caminhos em /etc/pathse /etc/paths.d/*normalmente são adicionados PATHporcaminho_helper. path_helperé executado a partir de /etc/profile, portanto, é executado quando o bash é invocado como um shell de login interativo, mas não quando o bash é invocado como um shell sem login ou como um shell não interativo.

/etc/pathscontém /usr/local/binno 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ê faz ssh no seu computador também é um shell de login. Muitos emuladores de terminal em outras plataformas, tmuxe o modo shell no Emacs abrem novos shells como shells sem 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

Ele altera o valor PATHdo processo root launchd. O valor é herdado por todos os outros processos, incluindo processos de inicialização por usuário. Você pode aplicar alterações /etc/launchd.confreiniciando ou executando launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confe reiniciando processos.

No OS X, ~/.profilenão é lido quando você faz login graficamente. Se ambos ~/.bash_profilee ~/.profileexistirem, o bash também não lê ~/.profile.

~/.MacOSX/environment.plistparou de funcionar em 10.8.

informação relacionada