Quando uso ZSH, come posso impostare PATH in /etc/profile.d?

18

Sto usando zsh come mia shell, e sto provando a configurare il mio ambiente.

Di solito definisco la mia variabile $JAVA_HOME creando un file:

/etc/profile.d/java.sh

con il seguente contenuto

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

quindi eseguo il logout e il back-in, e tutto funziona, ma per qualche motivo la variabile PATH non è impostata. Riconosce JAVA_HOME , ma non il nuovo PATH , guarda questo frammento di terminale:

~  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 l'ho confermato cercando di eseguire un comando da jvm

~  java -version
zsh: command not found: java

il PATH non include $JAVA_HOME come dovrebbe. c'è qualcos'altro che dovrei controllare?

Ho controllato che se corro:

source /etc/profile.d/java.sh

tutto funziona correttamente e le mie variabili vengono impostate come dovrebbero, ma gli script in /etc/profile.d non dovrebbero essere eseguiti automaticamente?

    
posta Rodrigo Sasaki 03.06.2014 - 15:39

4 risposte

17

Dal mio punto di vista, il modo migliore è aggiungere le seguenti righe al file ~/.zshrc (se non lo hai già, quindi crearlo):

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

Quindi riavvia il tuo zsh , o esegui solo source ~/.zshrc e il tuo PATH dovrebbe essere esattamente come desideri.

Oppure, se vuoi che la modifica sia estesa al sistema, aggiungi il codice precedente alla fine del file /etc/zsh/zshenv .

Ma in ogni caso non utilizzare /etc/profile.d per eseguire automaticamente gli script in zsh . Questa directory è utile solo per la shell bash , non per zsh come nel tuo caso. Per capire questo, apri /etc/profile file, che è un bash file di inizializzazione e in nessun caso un zsh file di inizializzazione , e vedrai da qualche parte il fine del file:

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

Quindi, gli script dalla directory /etc/profile.d verranno eseguiti automaticamente in zsh solo se aggiungi il codice precedente in un file di inizializzazione zsh, ad esempio /etc/zsh/zprofile per esempio o source /etc/profile in /etc/zsh/zprofile file.

    
risposta data Radu Rădeanu 03.06.2014 - 23:12
2

Trovo che posizionare tutto in un file .zshenv diventa rapidamente difficile da gestire. Raccomando di installare oh-my-sh e quindi di posizionare varie personalizzazioni (env vars, funzioni) su .oh-my-sh/custom/ directory come file .zsh separati.

Ho anche scoperto che questo approccio funziona in modo impeccabile quando si esegue ssh'ing in macchina quando si modificano le variabili env come PATH . Inoltre funziona molto bene insieme a vcsh per mantenere le personalizzazioni di cui è stato eseguito il backup e in sincronia.

    
risposta data dvim 26.06.2015 - 17:22
1

Dato che JAVA_HOME è impostato, hai confermato che tali script vengono originati automaticamente, non è vero?

L'unica spiegazione logica è che PATH è impostato più tardi in qualche modo. Dovrebbe essere originariamente impostato da PAM che legge /etc/environment , e per quanto ne so che accade prima che vengano importati /etc/profile.d/*.sh di file. Forse zsh funziona diversamente rispetto a bash in questo senso.

    
risposta data Gunnar Hjalmarsson 03.06.2014 - 22:54
0

È stato eseguito questo problema a livello locale dopo aver eseguito gli aggiornamenti. Sembra che il problema di root sia che Drush non sa dove trovare una copia legittima di php che include pdo. Fortunatamente supporta il salvataggio di questo percorso in una variabile di ambiente, quindi l'ho fatto sulla riga di comando:

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

Questo ha risolto il problema, quindi ho modificato .zshrc e l'ho aggiunto al file, problema risolto.

    
risposta data Allen Freeman 23.04.2015 - 18:50

Leggi altre domande sui tag