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

11

Tenho um entendimento básico de como o $ PATH pode ser definido, mas existe uma documentação que descreve completamente onde o Mac OS obtém todos os caminhos anexados ao $ PATH? Estou ciente de coisas como /etc/profile, /etc/pathse /etc/profile.d, mas existem outros scripts que, eventualmente, afetar o valor de US $ PATH? Também não estou muito familiarizado com o não-login e as conchas de login ( .bashrc, .bash_profile), mas estou ciente das diferenças básicas.

Soco psicótico
fonte

Respostas:

9

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

Chamado como um shell de logon interativo ou com --login

Quando o Bash é chamado 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.

Chamado como um shell interativo sem logon

Quando um shell interativo que não é um shell de login é iniciado, o Bash lê e executa comandos de ~ / .bashrc, se esse arquivo existir. Além disso, no OS X, é possível path_helperler o conteúdo /etc/paths.de anexá-lo 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 que não são de login. Josh Staiger tem uma boa explicação sobre shells de login versus não-login .

Portanto, existem essencialmente apenas esses dois três 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)
slhck
fonte
Obrigado pela resposta concisa e informativa. Então eu acho que meio que entendo quais scripts / artefatos influenciam o $ PATH então. Então, isso significa que o /etc/profilescript é usado principalmente pelo bash? Não tenho experiências com outras conchas, mas presumo que elas sigam uma estrutura diferente?
Psycho Punch #
O /etc/profileé usado pela maioria dos reservatórios (todos? Não 100% certo). É por isso que é uma boa escolha colocar as coisas que você deseja em qualquer lugar, como PATHs. O Bash lê .bash_arquivos enquanto o Zsh, por exemplo, lê .zshrcalém de outros. Depende da casca.
slhck #
"No OS X, além disso, existe path_helper que lê o conteúdo de /etc/paths.d e anexa-os ao seu caminho." Não, nãopath_helper é chamado para shells interativos sem login (nem shells não interativos). É chamado de shells de login interativo, na verdade. /etc/profile
Maggyero 15/09/19
8

Os caminhos /etc/pathse /etc/paths.d/*geralmente são adicionados PATHpor path_helper . path_helperé executado a partir de /etc/profile, portanto, é executado quando o bash é chamado como um shell de logon interativo, mas não quando o bash é chamado como um shell que não é de login ou um shell não interativo.

/etc/pathscontém /usr/local/binno final por padrão e /etc/paths.d/está vazio por padrão.

O Terminal e o iTerm 2 abrem novos shells como shells de login por padrão, e o shell aberto quando você faz o ssh no seu computador também é um shell de login. Muitos emuladores de terminal em outras plataformas, tmuxeo modo de 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 do PATHprocesso raiz 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.plist parou de funcionar em 10.8.

Lri
fonte