Cuando uso ZSH, ¿cómo configuro PATH en /etc/profile.d?

22

Estoy usando zshmi shell e intento configurar mi entorno.

Normalmente defino mi $JAVA_HOMEvariable creando un archivo:

/etc/profile.d/java.sh

con el siguiente contenido

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

luego me desconecto y vuelvo, y todo funciona, pero por alguna razón la PATHvariable no está configurada. Reconoce JAVA_HOME, pero no el nuevo PATH, vea este fragmento 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

y lo confirmé al intentar ejecutar un comando desde el jvm

~  java -version
zsh: command not found: java

el PATHno incluye el $JAVA_HOMEcomo debería. ¿Hay algo más que deba verificar?

Lo he comprobado si ejecuto:

source /etc/profile.d/java.sh

todo se ejecuta correctamente y mis variables se configuran como deberían, pero ¿no deberían /etc/profile.dejecutarse los scripts automáticamente?

Rodrigo Sasaki
fuente
¿Has intentado editar ~/.profiley colocar las variables allí? Puede ser que PATHse esté sobrescribiendo en otra parte de /etc/profile.d/.
saiarcot895

Respuestas:

27

Desde mi punto de vista, la mejor manera es agregar las siguientes líneas en el ~/.zshrcarchivo (si aún no lo tiene, entonces créelo):

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

Luego reinicie su zsh, o simplemente ejecute source ~/.zshrcy luego su RUTA debe ser exactamente como lo desee.

O, si desea que el cambio sea para todo el sistema, agregue el código anterior al final del /etc/zsh/zshenvarchivo.

Pero en cualquier caso, no lo use /etc/profile.dpara ejecutar scripts automáticamente zsh. Este directorio es útil solo para el bashshell, no zshcomo en su caso. Para entender esto, abra el /etc/profilearchivo, que es un archivo de inicialización bash y en ningún caso un archivo de inicialización zsh , y verá en algún lugar al final del archivo:

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

Por lo tanto, sus scripts del /etc/profile.ddirectorio se ejecutarán automáticamente zshsolo si agrega el código anterior en un archivo de inicialización zsh, como /etc/zsh/zprofilepor ejemplo, o fuente /etc/profileen el /etc/zsh/zprofilearchivo.

Radu Rădeanu
fuente
44
Quizás ~/.zprofilepodría ser mejor que ~/.zshrc.
muru
3

Me parece que colocar todo en un .zshenvarchivo rápidamente se vuelve difícil de administrar. Recomiendo instalar oh-my-sh y luego colocar varias personalizaciones (env vars, funciones) en el .oh-my-sh/custom/directorio como .zsharchivos separados .

También descubrí que este enfoque funciona a la perfección cuando ssh'ing en la máquina al modificar variables env como PATH. También funciona muy bien junto con vcsh para mantener las personalizaciones respaldadas y sincronizadas.

dvim
fuente
Usando oh my zsh framework, ¿dónde pondría una variable con una dirección IP (servidor remoto) para usar para acceso ssh? Necesito la ip para git y un script de inicio de sesión en el servidor.
Timo
1
Hm. No estoy muy seguro de lo que quieres decir. ~/.ssh/config
Pondría
Personalmente, prefiero este enfoque a la respuesta aceptada, ya que me gusta la ventaja de usar vcsh y la carpeta "personalizada" para ZSH es un lugar ideal para cosas como esta.
Erick Brown
1

Como JAVA_HOMEestá configurado, ha confirmado que esos scripts se obtienen automáticamente, ¿no es así?

La única explicación lógica es que PATHse establece más adelante de alguna manera. Originalmente debería ser configurado por PAM que lee /etc/environment, y que yo sepa, eso sucede antes de /etc/profile.d/*.shque se obtengan los archivos. Posiblemente zsh funciona diferente en comparación con bash en ese sentido.

Gunnar Hjalmarsson
fuente
0

Acabo de encontrar este problema localmente después de ejecutar actualizaciones. Parece que el problema raíz es que Drush no sabe dónde encontrar una copia legítima de php que incluya pdo. Afortunadamente, admite ocultar esta ruta en una variable de entorno, así que hice esto en la línea de comandos:

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

Eso solucionó el problema, así que edité .zshrc y agregué eso al archivo, problema resuelto.

Allen Freeman
fuente
1
Entonces, ¿estás sugiriendo que .zshrcse use, lo mismo que la respuesta principal ?
muru