Skompilowałem ostatnią wersję emacsa z kodu źródłowego (v24.2), ponieważ wersja zainstalowana na moim komputerze jest dla mnie (dość) stara (v21.3). Zrobiłem zwykle:
$configure --prefix=$HOME
make
make install
Teraz testuję emacsa i zdałem sobie sprawę, że nadal uruchamia poprzednią wersję ... podczas gdy moja $HOME/bin
ścieżka powinna zastąpić systemową (ponieważ w moim .bashrc
pliku jest ona poprzedzona wartością $ PATH ).
Moją pierwszą myślą było zobaczyć which
wyjście polecenia. I niespodzianka, daje ścieżkę do nowych emacs. Nie rozumiem, gdzie jest ta rozbieżność. W tej samej sesji są różne wyniki:
$ emacs --version
GNU Emacs 21.3.1
$ `which emacs` --version
GNU Emacs 24.2.1
Nie mam pseudonimu dotyczącego emacsa. W ogóle.
$ alias | grep emacs
$
Masz pomysł, co się dzieje?
Odpowiedzi:
Trzy możliwości, które przychodzą mi na myśl:
emacs
( dla którego sprawdziłeś)emacs
emacs
plik binarny nie znajduje się w tablicy skrótów PATH twojej powłoki.Możesz sprawdzić, czy masz funkcję
emacs
:I usuń to:
Twoja powłoka ma również tablicę mieszającą PATH, która zawiera odniesienie do każdego pliku binarnego w PATH. Jeśli dodasz nowy plik binarny o takiej samej nazwie jak istniejący gdzie indziej w PATH, powłoka musi zostać poinformowana poprzez aktualizację tablicy hashtable:
Dodatkowe wyjaśnienie:
which
nie wie o funkcjach, ponieważ nie jest to wbudowane bash:Ten skrypt pokazuje nowe binarne zachowanie tablicy hashtable.
Chociaż nie nazwałem go,
which cat
zawsze zwracałbym pierwszycat
w mojej ŚCIEŻCE, ponieważ nie używa on tablicy hashującej powłoki.źródło
type
polecenia.hash -r
naprawił mój problem.Tak, nie używaj które :
PATH
.Jest do tego wbudowany. Dwa, nawet:
type
icommand
. Sposób POSIX:W bash możesz także użyć,
type -p emacs
aby zobaczyć tylko ścieżkę zewnętrznego polecenia.Jednak tutaj
which
jest właściwie słuszne. Bash przechowuje informacje o lokalizacji polecenia w pamięci, aby następnym razem szybciej wykonać polecenie. Zainstalowałeśemacs
na swoim komputerze nowy plik wykonywalnyPATH
, ale bash nadal ma starą lokalizację w swojej pamięci podręcznej. Uruchom,hash emacs
abyemacs
ponownie wyszukać lubhash -r
opróżnić pamięć podręczną.źródło
Czy wylogowałeś się i zalogowałeś, aby
.bashrc
ponownie odczytać zaktualizowany plik logowania? Jeśli nie, środowisko twojej bieżącej sesji nie zostało zaktualizowane.źródło
`which emacs` --version
zgodziłby sięemacs --version
, ponieważwhich
dziedziczy swoją ŚCIEŻKĘ z bieżącej powłoki.