경로에서 bash의 실행 파일 캐시 비활성화


12

이것은 복제본 이 아닙니다 . 캐시를 지우지 않고 비활성화 하는 것에 대해 묻고 있습니다. 지우는 캐시가 있으면 분명히 비활성화되지 않습니다.

드물게 경로에서 찾은 것들에 대한 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
/usr/bin캐시에 완전히 남아있는 RAM이 많지 않은 경우 데스크톱 컴퓨터의 일반적인 경우에도 이점이 눈에 are니다 .
Gilles 'SO- 악마 그만해'

1
@drhyde, 죄송합니다. 이 질문을 중복으로 표시했습니다. set +h해싱을 비활성화하는 데 사용 합니다.
Evgeny Vereshchagin

Nixos에서는 bash에서 해시를 비활성화했습니다. 나는 Nixos의 일하는 방식 때문에 좋은 이유가 있다고 생각합니다. 그러나 이것이 Nixos에 실제로 필수인지 확실하지 않습니다. 나는 bash의 해시가 특정 상황에서 문제를 일으킬 수 있다고 말하고 있습니다.
typelogic

답변:


12

프롬프트가 표시되기 전에 해시 된 실행 파일을 지울 수 있습니다.

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.

1
참조 내 대답 에 대한set +h
예브게니 Vereshchagin

1
set +h많은 유틸리티 (예 : 루비 젬 설치)가 호출 hash하여 -bash: hash: hashing disabled경고 스트림을 생성 하므로 @EvgenyVereshchagin 은 이상적이지 않습니다 .
David Moles 2014

파이썬 virtualenv 활성화에서도 동일한 경고 메시지가 나타납니다. 그러나 나는 그것이 무해하다고 생각합니다.
typelogic

8

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

shopt -s checkhash

bash의 맨 페이지에서 :

체크해시

    설정된 경우, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.