web-dev-qa-db-fra.com

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

J'utilise zshcomme Shell et j'essaie de configurer mon environnement.

Je définis généralement ma variable $Java_HOME 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, puis je rentre, et tout fonctionne, mais pour une raison quelconque, la variable PATHn'est pas définie. Il reconnaît Java_HOME, mais pas le nouveau PATHname__, voir l'extrait de terminal suivant:

~  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 sous forme de jvm

~  Java -version
zsh: command not found: Java

le PATHn'inclut pas le $Java_HOME comme il se doit. Y a-t-il autre chose que je devrais vérifier?

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

source /etc/profile.d/Java.sh

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

22
Rodrigo Sasaki

De mon point de vue, la meilleure méthode consiste à ajouter les lignes suivantes dans le fichier ~/.zshrc (si vous ne l'avez pas déjà, créez-le):

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

Puis redémarrez votre zsh ou exécutez simplement source ~/.zshrc et votre PATH devrait alors être exactement comme vous le souhaitez.

Ou, si vous souhaitez apporter la modification à l'ensemble du système, ajoutez le code précédent à la fin du fichier /etc/zsh/zshenv.

Mais dans tous les cas, n'utilisez pas /etc/profile.d pour exécuter automatiquement des scripts dans zsh. Ce répertoire est utile uniquement pour le shell bash, et non pas zsh comme dans votre cas. Pour comprendre cela, ouvrez le fichier /etc/profile, qui est un fichier d’initialisation bash et en aucun cas zsh fichier d'initialisation , 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 du répertoire /etc/profile.d seront automatiquement exécutés dans zsh uniquement si vous ajoutez le code précédent dans un fichier d’initialisation zsh, comme par exemple /etc/zsh/zprofile ou source /etc/profile dans le fichier /etc/zsh/zprofile.

24
Radu Rădeanu

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

J'ai également découvert que cette approche fonctionne parfaitement lorsque ssh'ing dans la machine lors de la modification de variables env telles que PATH. En outre, cela fonctionne vraiment bien avec vcsh pour conserver les personnalisations sauvegardées et synchronisées.

2
dvim

Étant donné que Java_HOME est défini, vous avez confirmé que ces scripts proviennent automatiquement, n'est-ce pas?

La seule explication logique est que PATH est défini ultérieurement d'une manière ou d'une autre. Il devrait être défini à l'origine par PAM, qui lit /etc/environment, et autant que je sache, cela se produit avant que les fichiers /etc/profile.d/*.sh soient générés. Peut-être que zsh fonctionne différemment de bash à cet égard.

1

Je viens de rencontrer ce problème localement après avoir exécuté les mises à jour. On dirait que le problème fondamental est Drush ne sait pas où trouver une copie légitime de php incluant pdo. Heureusement, il prend en charge le stockage de ce chemin dans une variable d'environnement, je l'ai donc fait en 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, le problème est résolu.

0
Allen Freeman