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

18

Estou usando zsh como meu shell e estou tentando configurar meu ambiente.

Eu geralmente defino minha variável $JAVA_HOME 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

, faço o logout e o retorno, e tudo funciona, mas, por algum motivo, a variável PATH 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 no jvm

~  java -version
zsh: command not found: java

o PATH não inclui o $JAVA_HOME como deveria. há algo mais que devo verificar?

Eu verifiquei se eu corro:

source /etc/profile.d/java.sh

tudo roda corretamente e minhas variáveis são definidas como deveriam, mas os scripts em /etc/profile.d não devem ser executados automaticamente?

    
por Rodrigo Sasaki 03.06.2014 / 15:39

4 respostas

17

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

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

Em seguida, reinicie seu zsh ou apenas execute source ~/.zshrc e, em seguida, seu PATH deve ser exatamente o que você deseja.

Ou, se você quiser que a alteração seja em todo o sistema, adicione o código anterior ao final do arquivo /etc/zsh/zshenv .

Mas, em qualquer caso, não use /etc/profile.d para executar scripts automaticamente em zsh . Este diretório é útil apenas para o bash shell, não zsh como no seu caso. Para entender isso, abra o arquivo /etc/profile , que é um arquivo de inicialização bash e em nenhum caso um arquivo de inicialização zsh , e você verá em algum lugar na fim 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

Assim, os scripts do diretório /etc/profile.d serão executados automaticamente em zsh apenas se você adicionar o código anterior em um arquivo de inicialização zsh, como /etc/zsh/zprofile , por exemplo, ou source /etc/profile in /etc/zsh/zprofile file.

    
por Radu Rădeanu 03.06.2014 / 23:12
2

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

Eu também descobri que essa abordagem funciona perfeitamente quando está em ssh em uma máquina ao modificar variáveis env como PATH . Também funciona muito bem em conjunto com o vcsh para manter as cópias de segurança e a sincronização sincronizadas.

    
por dvim 26.06.2015 / 17:22
1

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

A única explicação lógica é que PATH é definido posteriormente de alguma forma. Ele deve ser originalmente definido pelo PAM, que lê /etc/environment , e, até onde eu sei, isso acontece antes dos arquivos /etc/profile.d/*.sh serem originados. Possivelmente, o zsh funciona diferente comparado ao bash nesse aspecto.

    
por Gunnar Hjalmarsson 03.06.2014 / 22:54
0

Apenas corri para este problema localmente depois de executar as atualizações. Parece que a questão raiz é Drush não sabe onde encontrar uma cópia legítima do php que inclui pdo. Felizmente, ele suporta o stashing deste caminho em uma variável de ambiente, então eu fiz isso na linha de comando:

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

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

    
por Allen Freeman 23.04.2015 / 18:50