경로에서 bash 실행 파일 캐싱을 비활성화합니다.

경로에서 bash 실행 파일 캐싱을 비활성화합니다.

이는아니요반복됨. 내가 묻는 것은장애를 입히다캐시를 지우는 대신 캐시를 삭제하세요. 삭제가 필요한 캐시가 있는 경우 분명히 비활성화되지 않았습니다.

드문 경우지만 나는 bash가 경로에서 찾은 것을 캐시하는 것을 발견했습니다. 그것이 도움이 되기 때문이 아니라 극도로 짜증스럽기 때문입니다. 한 가지 예:

~ dc$ export PATH=$HOME/bin:$PATH
~ dc$ cat bin/which
#!/bin/bash
echo "my which"
~ dc$ which
my which
~ dc$ rm bin/which
~ dc$ which which
-bash: /Users/dc/bin/which: No such file or directory

다른 껍질에...

~ dc$ which which
/usr/bin/which

디스크가 느리고 메모리가 비싸고 제한되어 많은 캐시를 할 수 없었던 옛날에는 이런 종류의 캐싱이 의미가 있었다고 확신합니다. 캐싱 경로는 조회 명령에 필요한 모든 디스크 블록을 캐싱하는 것보다 저렴했습니다. 그러나 오늘날 그것은 명확한 이점을 제공하지 않으며 해결하는 것보다 더 많은 문제를 야기합니다. 이것은 실수입니다. 거의 실수입니다.

비활성화하는 방법조차 찾을 수 없습니다. 어떤 충고?

답변1

프롬프트를 그리기 전에 해시된 실행 파일을 지울 수 있습니다.

PROMPT_COMMAND='hash -r'

에서 help hash:

hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.

Determine and remember the full pathname of each command NAME.  If
no arguments are given, information about remembered commands is displayed.

Options:
  -d                forget the remembered location of each NAME
  -l                display in a format that may be reused as input
  -p pathname       use PATHNAME is the full pathname of NAME
  -r                forget all remembered locations
  -t                print the remembered location of each NAME, preceding
            each location with the corresponding NAME if multiple
            NAMEs are given
Arguments:
  NAME              Each NAME is searched for in $PATH and added to the list
            of remembered commands.

Exit Status:
Returns success unless NAME is not found or an invalid option is given.

답변2

해시 테이블의 명령이 더 이상 존재하지 않으면 bash가 새로운 경로 조회를 수행하도록 강제할 수 있습니다.

shopt -s checkhash

Bash 맨페이지에서:

해시 값 확인

    설정된 경우,세게 때리다실행을 시도하기 전에 해시 테이블에 있는 명령이 있는지 확인합니다. 해시 명령이 더 이상 존재하지 않으면 일반 경로 검색이 수행됩니다.

예:

[blabla]$ PATH=$HOME/bin:$PATH
[blabla]$ hash -r
[blabla]$ cat bin/which
#!/bin/bash
echo "my which"
[blabla]$
[blabla]$ shopt -s checkhash
[blabla]$ which
my which
[blabla]$ mv bin/which bin/dis.which
[blabla]$ which which
/usr/bin/which

관련 정보