Quando uso o ZSH, como configuro o PATH no /etc/profile.d?

22

Estou usando zshcomo meu shell e estou tentando configurar meu ambiente.

Normalmente, defino minha $JAVA_HOMEvariável criando um arquivo:

/etc/profile.d/java.sh

com o seguinte conteúdo

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

então eu saio e volto a entrar, e tudo funciona, mas por algum motivo a PATHvariável não está definida. Ele reconhece JAVA_HOME, mas não o novo PATH, veja este trecho de terminal:

~  echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_05
~  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

e eu confirmei tentando executar um comando do jvm

~  java -version
zsh: command not found: java

o PATHnão inclui o $JAVA_HOMEque deveria. há algo mais que eu deveria verificar?

Eu verifiquei que se eu executar:

source /etc/profile.d/java.sh

tudo funciona corretamente e minhas variáveis ​​são definidas como deveriam, mas os scripts não deveriam ser /etc/profile.dexecutados automaticamente?

Rodrigo Sasaki
fonte
Você já tentou editar ~/.profilee colocar as variáveis ​​lá? Pode ser que PATHesteja sendo substituído em outro lugar /etc/profile.d/.
precisa saber é o seguinte

Respostas:

27

Do meu ponto de vista, a melhor maneira é adicionar as seguintes linhas no ~/.zshrcarquivo (se você ainda não o tiver, crie-o):

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi

Em seguida, reinicie o seu zsh, ou apenas execute source ~/.zshrce, em seguida, o seu PATH deve estar exatamente como você deseja.

Ou, se você deseja fazer a alteração para todo o sistema, adicione o código anterior ao final do /etc/zsh/zshenvarquivo.

Mas, em qualquer caso, não use /etc/profile.dpara executar scripts automaticamente zsh. Este diretório é útil apenas para o bashshell, não zshcomo no seu caso. Para entender isso, abra o /etc/profilearquivo, que é um arquivo de inicialização bash e, em nenhum caso, um arquivo de inicialização zsh , e você verá em algum lugar no final do arquivo:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Portanto, seus scripts do /etc/profile.ddiretório serão executados automaticamente zshsomente se você adicionar o código anterior em um arquivo de inicialização zsh, como /etc/zsh/zprofilepor exemplo, ou fonte /etc/profileno /etc/zsh/zprofilearquivo.

Radu Rădeanu
fonte
4
Talvez ~/.zprofilepossa ser melhor que ~/.zshrc.
muru
3

Acho que colocar tudo em um .zshenvarquivo rapidamente se torna difícil de gerenciar. Eu recomendo instalar o oh-my-sh e colocar várias personalizações (env vars, funções) no .oh-my-sh/custom/diretório como .zsharquivos separados .

Eu também descobri que essa abordagem funciona perfeitamente quando ssh'ing na máquina ao modificar variáveis ​​env como PATH. Também funciona muito bem em conjunto com o vcsh para manter as personalizações em backup e sincronizadas.

dvim
fonte
Usando oh my zsh framework, onde você colocaria uma variável com um endereço IP (servidor remoto) para usar no acesso ssh? Eu preciso do ip para git e um script de login para o servidor.
Timo
1
Hum. Não tenho certeza do que você quis dizer. Eu colocaria a configuração como endereços IP e nomes de usuários para ssh to~/.ssh/config
dvim
Pessoalmente, prefiro essa abordagem à resposta aceita, pois gosto da vantagem de usar o vcsh e a pasta "custom" do ZSH é o local ideal para coisas como essa.
Erick Brown em
1

Como JAVA_HOMEestá definido, você confirmou que esses scripts são originados automaticamente, não é?

A única explicação lógica é que isso PATHserá definido mais tarde. Ele deve ser originalmente definido pelo PAM que lê /etc/environmente, tanto quanto eu sei, isso acontece antes que os /etc/profile.d/*.sharquivos sejam originados. Possivelmente o zsh funciona diferente em comparação com o bash nesse aspecto.

Gunnar Hjalmarsson
fonte
0

Acabei de encontrar esse problema localmente após executar as atualizações. Parece que o problema principal é que o Drush não sabe onde encontrar uma cópia legítima do php que inclua pdo. Felizmente, ele suporta esconder esse caminho em uma variável de ambiente, então fiz isso na linha de comando:

export DRUSH_PHP="/Applications/MAMP/bin/php/php5.4.39/bin/php"

Isso resolveu o problema, então editei .zshrc e o adicionei ao arquivo, problema resolvido.

Allen Freeman
fonte
1
Então, você está sugerindo que .zshrcseja usado, o mesmo que a resposta principal ?
Muru