내 컴퓨터에 설치된 버전이 (v21.3) 이전 버전이기 때문에 소스 코드 (v24.2)에서 마지막 emacs 버전을 컴파일했습니다. 나는 평소를했다 :
$configure --prefix=$HOME
make
make install
이제는 emacs를 테스트하고 있으며 여전히 이전 버전을 시작한다는 것을 깨달았습니다 … 내 $HOME/bin
경로는 시스템을 무시해야합니다 (내 .bashrc
파일의 $ PATH 앞에 추가되기 때문에 ).
내 첫 번째 생각은 which
명령 출력 을 보는 것이 었습니다 . 놀랍게도, 그것은 새로운 이맥스로가는 길을 제공합니다. 불일치가 어디에 있는지 이해할 수 없습니다. 같은 세션에서 다른 출력이 있습니다.
$ emacs --version
GNU Emacs 21.3.1
$ `which emacs` --version
GNU Emacs 24.2.1
이맥과 관련된 별칭이 없습니다. 조금도.
$ alias | grep emacs
$
무슨 일인지 알 겠어?
답변
나를 위해 떠오르는 세 가지 가능성 :
- 에 대한 별칭이 있습니다
emacs
(확인한) - 기능이 존재합니다
emacs
- 새로운
emacs
바이너리는 쉘의 PATH 해시 테이블에 없습니다.
기능이 있는지 확인할 수 있습니다 emacs
.
bash-3.2$ declare -F | fgrep emacs
declare -f emacs
그리고 그것을 제거하십시오 :
unset -f emacs
또한 쉘에는 PATH의 각 바이너리에 대한 참조가 포함 된 PATH 해시 테이블이 있습니다. PATH의 다른 곳에서 기존 바이너리와 이름이 같은 새 바이너리를 추가하는 경우 해시 테이블을 업데이트하여 쉘에 알려야합니다.
hash -r
추가 설명 :
which
bash 내장이 아니기 때문에 함수에 대해 알지 못합니다.
bash-3.2$ emacs() { echo 'no emacs for you'; }
bash-3.2$ emacs
no emacs for you
bash-3.2$ which emacs
/usr/bin/emacs
bash-3.2$ `which emacs` --version | head -1
GNU Emacs 22.1.1
이 스크립트는 새로운 이진 해시 테이블 동작을 보여줍니다.
bash-3.2$ PATH=$HOME/bin:$PATH
bash-3.2$ cd $HOME/bin
bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ echo echo hi > cat
bash-3.2$ chmod +x cat
bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ hash -r
bash-3.2$ cat nofile
hi
bash-3.2$ rm cat
bash-3.2$ cat nofile
bash: /Users/mrb/bin/cat: No such file or directory
bash-3.2$ hash -r
bash-3.2$ cat nofile
cat: nofile: No such file or directory
호출하지는 않았지만 which cat
항상 cat
쉘의 해시 테이블을 사용하지 않기 때문에 항상 PATH 에서 첫 번째 를 반환합니다 .
답변
예, 어느 것을 사용하지 마십시오 :
- 일부 시스템에서는 csh 스크립트로 구현 된 외부 명령으로,을 변경하는 구성을 읽을 수 있습니다
PATH
. -
내장되어 있습니다. 두, 심지어 :
type
와command
. POSIX 방식 :command -v emacs # machine-readable format type emacs # human-only format
bash에서는
type -p emacs
외부 명령의 경로 만 볼 수도 있습니다 .
그러나 여기에 which
실제로 옳습니다. Bash는 명령 위치에 대한 정보를 메모리에 유지하므로 다음에 명령을 더 빨리 실행할 수 있습니다. 에 새 emacs
실행 파일을 설치 PATH
했지만 bash에는 여전히 캐시에 이전 위치가 있습니다. 다시 hash emacs
조회 emacs
하거나 hash -r
캐시를 비우려면 실행하십시오 .
답변
업데이트 된 .bashrc
로그인 파일을 다시 읽도록 로그 아웃하고 로그인 했습니까 ? 그렇지 않으면 현재 세션의 환경이 업데이트되지 않은 것입니다.