Lorsque j'utilise ZSH, comment définir PATH dans /etc/profile.d?

22

J'utilise zshcomme shell et j'essaye de configurer mon environnement.

Je définis généralement ma $JAVA_HOMEvariable en créant un fichier:

/etc/profile.d/java.sh

avec le contenu suivant

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

puis je me déconnecte et me reconnecte, et tout fonctionne, mais pour une raison quelconque, la PATHvariable n'est pas définie. Il reconnaît JAVA_HOME, mais pas le nouveau PATH, voir cet extrait 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

et je l'ai confirmé en essayant d'exécuter une commande depuis le jvm

~  java -version
zsh: command not found: java

le PATHne comprend pas le $JAVA_HOMEcomme il se doit. y a-t-il autre chose que je devrais vérifier?

J'ai vérifié que si je lance:

source /etc/profile.d/java.sh

tout fonctionne correctement et mes variables sont définies comme elles le devraient, mais les scripts ne devraient-ils pas /etc/profile.ds'exécuter automatiquement?

Rodrigo Sasaki
la source
Avez-vous essayé de modifier ~/.profileet de placer les variables à la place? Il se peut que cela PATHsoit écrasé ailleurs dans /etc/profile.d/.
saiarcot895

Réponses:

27

De mon point de vue, la meilleure façon est d'ajouter les lignes suivantes au ~/.zshrcfichier (si vous ne l'avez pas déjà, alors créez-le):

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

Ensuite, redémarrez votre zsh, ou exécutez simplement source ~/.zshrcet votre CHEMIN devrait être exactement comme vous le souhaitez.

Ou, si vous souhaitez effectuer la modification à l'échelle du système, ajoutez le code précédent à la fin du /etc/zsh/zshenvfichier.

Mais dans tous les cas, ne l'utilisez pas /etc/profile.dpour exécuter automatiquement des scripts dans zsh. Ce répertoire n'est utile que pour le bashshell, pas zshcomme dans votre cas. Pour comprendre cela, ouvrez le /etc/profilefichier, qui est un fichier d'initialisation bash et en aucun cas un fichier d'initialisation zsh , et vous verrez quelque part à la fin du fichier:

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

Ainsi, vos scripts à partir du /etc/profile.drépertoire ne s'exécuteront automatiquement zshque si vous ajoutez le code précédent dans un fichier d'initialisation zsh, comme /etc/zsh/zprofilepar exemple, ou source /etc/profiledans un /etc/zsh/zprofilefichier.

Radu Rădeanu
la source
4
Peut ~/.zprofile-être mieux que ça ~/.zshrc.
muru
3

Je trouve que tout placer dans un seul .zshenvfichier devient rapidement difficile à gérer. Je recommande d'installer oh-my-sh , puis de placer diverses personnalisations (vars env, fonctions) dans le .oh-my-sh/custom/répertoire sous forme de .zshfichiers séparés .

J'ai également découvert que cette approche fonctionne parfaitement lors de la transformation en machine lors de la modification de variables env telles que PATH. De plus, cela fonctionne très bien avec vcsh pour garder les personnalisations sauvegardées et synchronisées.

dvim
la source
En utilisant oh mon framework zsh, où mettriez-vous une variable avec une adresse ip (serveur distant) à utiliser pour l'accès ssh? J'ai besoin de l'ip pour git et d'un script de connexion au serveur.
Timo
1
Hm. Je ne sais pas trop ce que tu veux dire. Je mettrais la configuration comme les adresses IP et les noms d'utilisateur pour ssh to~/.ssh/config
dvim
Personnellement, je préfère cette approche à la réponse acceptée car j'aime l'avantage d'utiliser vcsh et le dossier "personnalisé" pour ZSH est un endroit idéal pour des trucs comme ça.
Erick Brown
1

Depuis que JAVA_HOMEc'est défini, vous avez confirmé que ces scripts proviennent automatiquement, n'est-ce pas?

La seule explication logique est que cela PATHest défini plus tard d'une manière ou d'une autre. Il devrait être défini à l'origine par PAM qui lit /etc/environment, et pour autant que je sache, cela se produit avant que les /etc/profile.d/*.shfichiers ne proviennent. Il est possible que zsh fonctionne différemment de bash à cet égard.

Gunnar Hjalmarsson
la source
0

Je viens de rencontrer ce problème localement après avoir exécuté les mises à jour. On dirait que le problème racine est que Drush ne sait pas où trouver une copie légitime de php qui inclut pdo. Heureusement, il prend en charge le stockage de ce chemin dans une variable d'environnement, donc je l'ai fait sur la ligne de commande:

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

Cela a résolu le problème, j'ai donc modifié .zshrc et ajouté cela au fichier, problème résolu.

Allen Freeman
la source
1
Donc, vous proposez que cela .zshrcsoit utilisé, la même chose que la première réponse ?
muru