내 컴퓨터에 설치된 버전이 나에게는 (오히려) 오래되었기 때문에 소스(v24.2)에서 마지막 emacs 버전을 컴파일했습니다(v21.3). 나는 평소대로 이렇게 했습니다:
$configure --prefix=$HOME
make
make install
이제 나는 emacs를 테스트하고 있으며 여전히 이전 버전을 시작한다는 것을 깨달았습니다. 반면 내 $HOME/bin
경로는 시스템 경로보다 우선 적용되어야 합니다(내 .bashrc
파일 앞에 $PATH에 추가되었기 때문입니다).
which
내 첫 번째 생각은 명령 출력을 보는 것이 었습니다 . 놀랍게도 이는 새로운 emacs에 대한 경로를 제공합니다. 차이점이 무엇인지 이해하지 못합니다. 동일한 세션에서 다음은 다른 결과입니다.
$ emacs --version
GNU Emacs 21.3.1
$ `which emacs` --version
GNU Emacs 24.2.1
나는 emacs 별칭을 다루지 않았습니다. 절대적으로하지.
$ alias | grep emacs
$
무슨 일이 일어났는지 아세요?
답변1
마음속에 떠오르는 세 가지 가능성:
- 별칭이 존재함
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
항상 내 PATH의 첫 번째 항목을 반환합니다 .cat
답변2
- 일부 시스템에서는 변경 사항을 읽을 수 있는 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
캐시를 삭제하세요.
답변3
로그아웃했다가 로그인하면 .bashrc
업데이트된 로그인 파일을 다시 읽게 됩니까? 그렇지 않은 경우 현재 세션 환경이 업데이트되지 않은 것입니다.