`hash -p`가 외부 명령 이름의 경로 이름을 변경합니까?

`hash -p`가 외부 명령 이름의 경로 이름을 변경합니까?

~.profile

PATH="/path/1/":"/path/2/":"$PATH"

/path/1/그리고 /path/2/둘 다 동일한 이름을 가진 실행 파일을 가지고 있습니다 myexecutable.

비로그인 대화형 셸에서 일시적으로 두 디렉터리 간의 검색 순서를 바꾸고 싶습니다.

Bash 매뉴얼에 따르면hash

-p 옵션은 경로 검색을 비활성화하고 파일 이름이 이름 위치로 사용됩니다.

내 방법은

$ hash -p /path/2/myexecutable
hits    command
   3    /usr/bin/which
   4    /usr/bin/psql
   1    /bin/cat
  10    /usr/bin/sudo
   1    /bin/mv
   1    /usr/bin/whereis
   3    /bin/mkdir
  19    /bin/ls

출력은 와 동일 하며 변경 hash되지 않는 것 같습니다 .myexecutable/path/2/myexecutable

$ which myexecutable
/path/1/myexecutable

그렇다면 hash -p실제로는 무엇을 합니까?

감사해요.

답변1

에서 help hash:

해시: 해시 [-lr] [-p 경로 이름] [-dt] [이름...]

-p pathname은 PATHNAME을 NAME의 전체 경로 이름으로 사용합니다.

그래서:

$ hash -p   /path/2/myexecutable   myexecutable

당신이 원하는 것을 할 것입니다.

물론, 실행 파일 이름으로 일부 게임을 플레이할 수 있습니다.

$ hash -p   /bin/echo  myexecutable

echo전화할 때 바로 실행하세요 myexecutable.

$ myexecutable Hello World
Hello World

답변2

$ touch file
$ ls
file
$ hash
hits    command
   1    /usr/bin/touch
   1    /bin/ls
$ hash -p /hello/world/ls ls
$ ls
bash: /hello/world/ls: No such file or directory

hash -p somepath somecommand에서 somecommand지정된 경로 로 해시 경로를 설정합니다.somepathbash

PATH이는 일반적 으로 두 디렉토리 사이의 검색 순서를 바꾸는 데 도움이 되지 않습니다 . 왜냐하면 hash -p두 디렉토리에 나타나는 모든 바이너리에 대해 이를 사용해야 하기 때문입니다. 그러한 바이너리가 하나만 있는 경우 실행 가능한 옵션이 될 수 있습니다. 보다 이식성이 뛰어난 솔루션은 단순히 PATH두 번째 디렉터리의 값을 앞에 추가하는 것입니다.

원본 PATH

/path/1:/path/2:...

당신은 먼저 그것을

/path/2:/path/1:/path/2:...

그런 다음 hash -r해시 경로를 재설정하고 평소대로 바이너리를 사용하십시오. 이제 이 항목은 에서 가져 /path/2오지 않고 에서 가져옵니다 /path/1.

PATH임시변수에 ​​저장하시면 원본 데이터를 쉽게 복원하실 수 있습니다 .

요약:

oldpath=$PATH
PATH=/path/2:$PATH
hash -r

# do stuff

PATH=$oldpath
hash -r

관련 정보