2013-03-29 4 views
2
OS X 10.8.3에서

,이 같은 환경을 :

$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12) 
Copyright (C) 2007 Free Software Foundation, Inc. 
$ echo $PATH 
/Users/r/Desktop/Beryl/usr/bin:/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/local/bin:/usr/X11R6/bin 

로 제대로 which에 의해보고 된 $ PATH에 irb의 두 사본이 있습니다

$ which -a irb 
/Users/r/Desktop/Beryl/usr/bin/irb 
/usr/bin/irb 

하지만 실행 irb은 나는/Users/r/Desktop/Beryl/usr/bin/irb를 얻을 것으로 기대한다. 대신에/usr/bin/irb를 얻습니다 :

$ irb --version 
irb 0.9.5(05/04/13)   # this is the wrong version 
$ /Users/r/Desktop/Beryl/usr/bin/irb --version 
irb 0.9.6(09/06/30) 
$ /usr/bin/irb --version 
irb 0.9.5(05/04/13) 

별칭이 없습니다. 나는이 스크립트를 실행하여 떠들썩한 파티를 시작 언급한다 :

#!/bin/sh 
export PATH=/Users/r/Desktop/Beryl/usr/bin:${PATH} 
exec /bin/bash 

에 관계없이, 왜 배쉬는 $ 경로의 첫 번째 인스턴스를 실행하지?

+2

당신은'형 irb'을 실행하고 우리에게 출력을 말할 수 있습니까? – anubhava

+0

@fearless_fool'which'는 bash가 실제로 어떤 일을할지 알려주지 않습니다; 'type'은 않습니다. 별칭이나 함수가 있다면,'type irb'는 그것에 대해 알 것입니다. –

+0

@anubhava : "$ irb => irb는 해시되었습니다 (/ usr/bin/irb)"라고 생각합니다. 그리고 bash/hash/type에있는 문서를 읽었을 때, 나는 왜'which'가 올바른 것을 선택하지 않았는지를 이해합니다. 답변을 게시하고 싶다면 ('hash -r'가 정리를 해줄 것입니다.) 체크 표시를 해 드리겠습니다. –

답변

2

사용 :

type irb 

는 bash 쉘은 모든 기억 위치를 잊을 수 있도록하려면 사용

hash -r 

그 bash 쉘은 irb의 이전 위치가 나타납니다 내부 해시에 저장됩니다. 여기

확인은 떠들썩한 파티에서 해시에 대한 자세한 이물 : http://linux.about.com/library/cmd/blcmdl1_hash.htm

+1

그게 정확히 무슨 일이 있었는지 : irb 명령을 실행 (해시가 원인) 다음 새 irb 생성 된 빌드 스크립트를 실행. 나는 bash가 irb의 새 버전을 선택할 것을 기대했지만 물론 해시 -r을 할 때까지 해쉬 된 것을 선호했다. –

+0

또한 http://unix.stackexchange.com/questions/86012/what-is- 해시 명령의 목적 –

2

문제를 일으키는 해시 일 수 있습니다. 프로그램을 처음 실행하면 PATH이 표시되고 bash은 내부 해시로 위치를 저장합니다. 이 값은 $PATH에 관계없이 이후 (같은 세션에서)이 해시를 사용합니다.

hash 명령으로 기존 위치를 나열하십시오.

hash -r으로 해시를 지울 수 있습니다.

편집 : 연관 배열 BASH_CMDS도 참조하십시오. IRB가 ​​실행되는 위치에서 결정하기 위해 다음

+0

이것은 정답이고 나는 그것을 upvote거야. Anubhava는 처음으로'type' (그리고 해시)을 제안 했으므로, anubhava가 원하는지 여부를 듣기 전까지 수표를 보류하겠습니다. –

+0

을 제쳐두고 다른 사람이 bash의 OS X 버전이 fsevent를 사용하여 효율적으로 해시 캐시를 무효화 할 수 있다고 생각합니까? 이런 종류의 놀라움을 막을 것입니다 ... –

+0

@fearless_fool : FSEvent는 파일 시스템이 변경 될 때만 트리거됩니다. – anubhava