
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/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 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 bash
e pular para a INVOCATION
parte.
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_helper
que lê o conteúdo/etc/paths.d
e 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 chamapath_helper
)/etc/paths
e/etc/paths.d
(chamado depath_helper
)- seu arquivo de configuração do shell (
.bash_profile
)
Responder2
Os caminhos em /etc/paths
e /etc/paths.d/*
normalmente são adicionados PATH
porcaminho_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/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ê faz ssh no 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 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 PATH
do 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.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 ambos ~/.bash_profile
e ~/.profile
existirem, o bash também não lê ~/.profile
.
~/.MacOSX/environment.plist
parou de funcionar em 10.8.