내 "어느" 명령이 (가끔) 틀릴 수도 있나요?

내 "어느" 명령이 (가끔) 틀릴 수도 있나요?

내 컴퓨터에 설치된 버전이 나에게는 (오히려) 오래되었기 때문에 소스(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

추가 참고 사항:

whichbash 내장 기능이 아니기 때문에 이 기능에 대해 모릅니다.

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.
  • 내장된 기능이 있습니다. 두 개의 짝수: 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캐시를 삭제하세요.

답변3

로그아웃했다가 로그인하면 .bashrc업데이트된 로그인 파일을 다시 읽게 됩니까? 그렇지 않은 경우 현재 세션 환경이 업데이트되지 않은 것입니다.

관련 정보