Onde colocar as asserções de variáveis ​​$ PATH no zsh?

111

Eu amo zsh, mas não tenho certeza de onde colocar minhas $PATHafirmações e outras variáveis? Acho que eles estão espalhados entre os arquivos .zshrc .zprofile .bashrc .bash_profilee, às vezes, duplicados.

I perceber que ter qualquer coisa dentro dos basharquivos não faz muito sentido vendo como eu estou usando zsh, mas onde exatamente eu deveria estar colocando minhas rvm, python, nodeetc adições à minha $PATH?

Há um arquivo específico que devo usar (ou seja, .zshenvque não existe atualmente na minha instalação), um dos que estou usando atualmente, ou isso importa?

Stefmikhail
fonte

Respostas:

148

versão tl; dr: use ~/.zshrc

E leia a página do manual para entender as diferenças entre:

~/.zshrc, ~/.zshenve ~/.zprofile.


Em relação ao meu comentário

Em meu comentário anexado à resposta que kev deu , eu disse:

Isso parece estar incorreto - / etc / profile não está listado em nenhuma documentação zsh que posso encontrar.

Isso acabou sendo parcialmente incorreto: /etc/profile pode ser fornecido por zsh. No entanto , isso ocorre apenas se zshfor "invocado como shou ksh"; nestes modos de compatibilidade:

Os scripts usuais de inicialização / desligamento zsh não são executados. Login shells source / etc / profile seguido por $ HOME / .profile. Se a variável de ambiente ENV for definida na chamada, $ ENV será originado após os scripts de perfil. O valor de ENV está sujeito à expansão de parâmetro, substituição de comando e expansão aritmética antes de ser interpretado como um nome de caminho. [ man zshall, "Compatibilidade" ].

O link do ArchWiki ZSH diz:

No login, o Zsh fornece os seguintes arquivos nesta ordem:
/ etc / profile
Este arquivo é fornecido por todos os shells compatíveis com Bourne no login

Este implys que /etc/profileé sempre ler por zshno início da sessão - Eu não tenho nenhuma experiência com o projeto Arch Linux; o wiki pode ser correto para aquela distribuição, mas geralmente não é correto. As informações estão incorretas em comparação com as páginas de manual do zsh e não parecem se aplicar ao zsh no OS X (os caminhos $PATHdefinidos em /etc/profilenão chegam às minhas sessões zsh).



Para resolver a questão:

onde exatamente devo colocar minhas adições de rvm, python, nó, etc. em meu $ PATH?

Geralmente, gostaria de exportar meu $PATHpartir ~/.zshrc, mas vale a pena ter uma leitura do zshall página do homem, especificamente a seção "Inicialização / desligamento FILES" - ~/.zshrcé lido para interativas conchas, que pode ou não atender às suas necessidades - se você quiser o $PATHpara cada zshshell invocado por você (ambos interactivee não, ambos logine não etc.), ~/.zshenvé uma opção melhor.

Há um arquivo específico que devo usar (ou seja, .zshenv que não existe atualmente na minha instalação), um dos que estou usando atualmente, ou isso importa?

Há um monte de arquivos lidos na inicialização (verifique as manpáginas vinculadas ), e há uma razão para isso - cada arquivo tem seu lugar particular (configurações para cada usuário, configurações específicas do usuário, configurações para shells de login, configurações para cada shell, etc).
Não se preocupe por ~/.zshenvnão existir - se você precisar, faça e ele será lido.

.bashrce não.bash_profile são lidos por , a menos que você explicitamente os origine de ou similar; a sintaxe entre e é não sempre compatíveis. Ambos e são projetados para configurações, não configurações.zsh~/.zshrcbashzsh.bashrc.bash_profilebashzsh

simont
fonte
3
Obrigado pela sua resposta mais do que completa simont. Estranho que você diga .bashrce .bash_profilenão seja lido por zsheu atualmente ter meu rvmacréscimo $PATHem .bashrce meu pythonacréscimo em .bash_profile, e ambos estão sendo adicionados muito bem. Em qualquer caso, vou mover todas as minhas $PATHexportações para, ~/.zshrcpois todas as minhas outras zshconfigurações estão alojadas lá. Tenho que admitir, não estou muito familiarizado com os diferentes tipos de conchas. Lendo os links que você postou, suponho que uso um shell interativo, mas lerei mais para ter certeza ... Obrigado novamente!
stefmikhail
30

Aqui estão os documentos das páginas de manual do zsh na seção STARTUP / SHUTDOWN FILES.

   Commands  are  first  read from /etc/zshenv this cannot be overridden.
   Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the
   former  affects all startup files, while the second only affects global
   startup files (those shown here with an path starting with  a  /).   If
   one  of  the  options  is  unset  at  any point, any subsequent startup
   file(s) of the corresponding type will not be read.  It is also  possi-
   ble  for  a  file  in  $ZDOTDIR  to  re-enable GLOBAL_RCS. Both RCS and
   GLOBAL_RCS are set by default.

   Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login
   shell,  commands  are  read from /etc/zprofile and then $ZDOTDIR/.zpro-
   file.  Then, if the  shell  is  interactive,  commands  are  read  from
   /etc/zshrc  and then $ZDOTDIR/.zshrc.  Finally, if the shell is a login
   shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

A partir disso, podemos ver que a ordem de leitura dos arquivos é:

/etc/zshenv    # Read for every shell
~/.zshenv      # Read for every shell except ones started with -f
/etc/zprofile  # Global config for login shells, read before zshrc
~/.zprofile    # User config for login shells
/etc/zshrc     # Global config for interactive shells
~/.zshrc       # User config for interactive shells
/etc/zlogin    # Global config for login shells, read after zshrc
~/.zlogin      # User config for login shells
~/.zlogout     # User config for login shells, read upon logout
/etc/zlogout   # Global config for login shells, read after user logout file

Você pode obter mais informações aqui .

jor
fonte
18

Tive um problema semelhante (no comando bash terminal estava funcionando corretamente, mas zsh mostrou erro de comando não encontrado)

Solução:


basta colar o que você estava colando anteriormente em ~ / .bashrc em:

~/.zshrc
abe312
fonte