Linux/bash가 "이것은" 실행 파일을 실행하지 않음을 알려줍니다 [중복]

Linux/bash가 "이것은" 실행 파일을 실행하지 않음을 알려줍니다 [중복]

관찰하다: /b/foo에 foo라는 실행 파일이 있습니다. 동적 라이브러리의 이전 헤더에 대해 컴파일되어 실행 시 세그폴트가 발생했습니다.

$ foo
Segmentation fault. // Expected behaviour.

이제 새 동적 라이브러리를 기반으로 foo의 새 버전을 /a/foo로 컴파일합니다. 그러면 정상적으로 실행됩니다. a/ 디렉토리는 $PATH에서 b/ 앞에 있으므로 /a/foo를 선택해야 합니다.

$ which foo
/a/foo

foo를 실행하면 다음과 같은 일이 발생합니다.

$ foo
Segmentation fault.

따라서 /b/foo가 실행되는 것처럼 보이지만 "which"는 /a/foo가 실행되어야 함을 알려줍니다. 더 이상한 점은 전체 경로 $(which /a/foo)를 실행하면 모든 것이 잘 작동한다는 것입니다.

$ /a/foo
OK!

$ cp /a/foo .
$ ./foo
OK!

한 단계 더 나아가 이제 /a/foo를 삭제하면 다음과 같습니다.

$ rm /a/foo

그러면 /b/foo여야 합니다. 그렇죠?

$ which foo
/b/foo
$ foo
bash: /a/foo: No such file or directory
$ $(which foo)
Segmentation fault. // Expected result.

아니요!

문제를 해결하세요: 소스 .bash_profile 및 .bashrc 문제가 사라집니다.

재현성: 매번. /a/foo를 삭제하고 ~/.bash_profile을 소스로 만들고 /a/foo를 생성하면 위의 관찰 내용이 다시 나타납니다.

질문: 여기서 무슨 일이 일어나고 있는지 아는 사람이 있습니까?

가정: "어느"가 최신이지만 시스템은 "과거 상황"을 기준으로 선택합니다. 위의 예에서 터미널을 열면 /a/foo가 아직 존재하지 않습니다. 방금 만들었습니다. 그러면 /a/foo가 생성되면 "어느"가 /a/foo를 감지하지만 시스템이 여전히 동기화되지 않았기 때문에 /b/foo를 선택합니까? 그런데 왜 시스템이 동기화되지 않습니까?

답변1

Bash가 명령을 캐시하는 곳. hash foo캐시를 강제로 업데이트하는 데 사용됩니다 .

또한 which이것은 단일 명령이므로 쉘이 실제로 어디를 찾고 있는지 알려주지 않고 단지 $PATH환경 ​​변수를 조회합니다. Bash에서는 다음을 사용해야 합니다 type:

$ type foo
foo is hashed (/a/foo)

관련 정보