내~.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
지정된 경로 로 해시 경로를 설정합니다.somepath
bash
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