내`어느`명령이 틀릴 수 있습니까 (때로는)?


17

내 컴퓨터에 설치된 버전이 (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
$

무슨 일인지 알 겠어?


이맥스는 무엇을 반환합니까?
Ulrich Dangel

답변:


29

나를 위해 떠오르는 세 가지 가능성 :

  • 에 대한 별칭이 있습니다 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 에서 첫 번째 를 반환합니다 .


1
여기에는 좋은 정보가 있지만 type명령 에는 빠져 있습니다 .
jordanm

고맙게도, 새로 컴파일 된 sqlite3 버전과 동일한 문제가 발생하여 너트를 만들었습니다 (실제로 올바른 경로를 반환했지만 쉘은 올바른 sqlite3 cli를 호출하지 않았습니다). hash -r내 문제를 해결했습니다.
mpm

12

예, 어느 것을 사용하지 마십시오 :

  • 일부 시스템에서는 csh 스크립트로 구현 된 외부 명령으로,을 변경하는 구성을 읽을 수 있습니다 PATH.
  • 내장되어 있습니다. 두, 심지어 : typecommand. 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캐시를 비우려면 실행하십시오 .


1

업데이트 된 .bashrc로그인 파일을 다시 읽도록 로그 아웃하고 로그인 했습니까 ? 그렇지 않으면 현재 세션의 환경이 업데이트되지 않은 것입니다.


이 경우 현재 쉘에서 PATH를 상속 하기 때문에에 `which emacs` --version동의합니다 . emacs --versionwhich
mrb

@mrb : 잘 찍은 점.
JR 퍼거슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.