Como saber por que e onde a variável $ PATH env está definida?

6

Estou usando a versão zsh 5.0.8 no iterm2 no OSX.

Eu inicio meu computador e printenv mostra a variável $PATH :

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

pelo que entendi, o zsh irá fornecer o seguinte arquivo na ordem:

/etc/zshenv
~/.zshenv
/etc/zshrc
~/.zshrc

Eu verifiquei, não tenho os 3 primeiros arquivos, e meu .zshrc é basicamente vazio, nada relacionado à variável $ PATH.

Então, onde está a variável $PATH definida ???

    
por Aaron Shen 02.12.2015 / 03:28

2 respostas

11

Eu literalmente acabei de ter uma batalha com isso hoje.

No OS X Yosemite, o PATH é construído de forma bastante indireta.

Eu acredito que, como cremefraiche diz, ZSH tem um $PATH embutido que ele usa se nada mais estiver definido, mas não é de onde vem o seu. Primeiro de tudo existe um arquivo, /etc/paths , que contém uma lista de diretórios. Há também um diretório, /etc/path.d , que contém mais arquivos que contêm diretórios. O programa /usr/libexec/path_helper pega essas listas de diretórios, mescla-as com a variável $PATH existente (se houver), remove quaisquer duplicatas e gera o resultado, com os diretórios /etc/paths listados primeiro.

Você pode tentar executá-lo sozinho, não faz mal algum. Aqui está a saída da minha:

$ /usr/libexec/path_helper 
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/alan/.local/bin:/Users/alan/src/go/bin"; export PATH;

Por si só, isso não faz nada, mas é chamado de, na minha máquina, /etc/zprofile :

if [ -x /usr/libexec/path_helper ]; then
    eval '/usr/libexec/path_helper -s'
fi

Isso pode variar em sua máquina, pois parece que a Apple mudou esse código em algumas versões diferentes do OS X.

Aqui está a lista de todos os arquivos que o ZSH lê no OS X, na ordem em que são avaliados:

  1. / etc / zshenv
  2. ~ / .zshenv
  3. / etc / zprofile
  4. ~ / .zprofile
  5. / etc / zshrc
  6. ~ / .zshrc
  7. / etc / zlogin
  8. ~ / .zlogin
  9. ~ / .zlogout
  10. / etc / zlogout

Alguns desses arquivos não são avaliados em determinadas circunstâncias, como quando executados como scripts de shell não interativos, mas não vou discutir isso aqui. Está na página de manual do ZSH se você estiver interessado.

$ man zsh

Vale a pena notar que /etc/zprofile é executado após ~/.zshenv , portanto, se você seguir as diretrizes ZSH e definir seu $PATH em .zshenv, ele provavelmente será prejudicado por path_helper . Se você estiver com esse problema, talvez valha a pena renomear /etc/zprofile as /etc/zshenv , então o sistema $PATH será definido o mais cedo possível.

    
por 19.12.2015 / 22:28
1

Isso se refere a bash , mas suspeito que também seja aplicável a zsh .

The default value of PATH is determined when bash is compiled. It is not set in a startup file, although it might be modified there.

A Practical Guide to Fedora and Red Hat Enterprise Linux: Seventh Edition. p359.

Editar

Eu fiz mais algumas pesquisas e descobri que o padrão PATH é de fato definido durante a compilação, e pode ser encontrado no init.c file.

/* Set default path */
path    = (char **) zalloc(sizeof(*path) * 5);
path[0] = ztrdup("/bin");
path[1] = ztrdup("/usr/bin");
path[2] = ztrdup("/usr/ucb");
path[3] = ztrdup("/usr/local/bin");
path[4] = NULL;

EDIT2:

Entrei no zsh IRC no freenode, e um desenvolvedor conseguiu me dar uma lista de quatro comandos diferentes que demonstram que o PATH está definido na compilação. Eu postei esses comandos no chat estendido, mas não percebi que eles seriam perdidos após um período de tempo X. Pergunte aos desenvolvedores no IRC para demonstrar se você gostaria de ver por si mesmo.

    
por 02.12.2015 / 09:04

Tags