J'ai compilé la dernière version d'emacs à partir du code source (v24.2) car la version installée sur ma machine est (assez) ancienne pour moi (v21.3). J'ai fait comme d'habitude:
$configure --prefix=$HOME
make
make install
Maintenant, je teste emacs et j'ai réalisé qu'il lance toujours la version précédente ... alors que mon $HOME/bin
chemin est censé remplacer celui du système (car il est ajouté à $ PATH dans mon .bashrc
fichier).
Ma première pensée a été de voir la which
sortie de la commande. Et surprise, elle ouvre la voie aux nouveaux emacs. Je ne peux pas comprendre où est la différence ici. Dans la même session, voici les différentes sorties:
$ emacs --version
GNU Emacs 21.3.1
$ `which emacs` --version
GNU Emacs 24.2.1
Je n'ai pas d'alias impliquant emacs. Du tout.
$ alias | grep emacs
$
Une idée de ce qui se passe s'il vous plaît?
Réponses:
Les trois possibilités qui me viennent à l'esprit:
emacs
(que vous avez vérifié)emacs
emacs
binaire n'est pas dans la table de hachage PATH de votre shell.Vous pouvez vérifier si vous avez une fonction
emacs
:Et retirez-le:
Votre shell a également une table de hachage PATH qui contient une référence à chaque binaire de votre PATH. Si vous ajoutez un nouveau binaire avec le même nom qu'un existant ailleurs dans votre PATH, le shell doit être informé en mettant à jour la table de hachage:
Explication supplémentaire:
which
ne connaît pas les fonctions, car ce n'est pas une commande bash:Un nouveau comportement de table de hachage binaire est démontré par ce script.
Bien que je ne l'appelle pas,
which cat
je retournerais toujours le premiercat
dans mon PATH, car il n'utilise pas la table de hachage du shell.la source
type
commande.hash -r
a résolu mon problème.Oui, n'utilisez pas lequel :
PATH
.Il y a une fonction intégrée pour cela. Deux, même:
type
etcommand
. La manière POSIX:En bash, vous pouvez également utiliser
type -p emacs
pour voir uniquement le chemin d'une commande externe.Cependant, ici,
which
c'est vraiment vrai. Bash conserve des informations sur l'emplacement d'une commande en mémoire, afin de pouvoir exécuter la commande plus rapidement la prochaine fois. Vous avez installé un nouvelemacs
exécutable sur votrePATH
, mais bash a toujours l'ancien emplacement dans son cache. Exécutezhash emacs
pour rechercher àemacs
nouveau ouhash -r
pour vider le cache.la source
Vous êtes-vous déconnecté et connecté pour que votre
.bashrc
fichier de connexion mis à jour soit relu? Sinon, l'environnement de votre session actuelle n'a pas été mis à jour.la source
`which emacs` --version
serait d'accord avecemacs --version
, carwhich
hérite son PATH du shell actuel.