“명령을 찾을 수 없음”과“그러한 파일이나 디렉토리가 없습니다”의 차이점은 무엇입니까?


33

예를 들면 다음과 같습니다.

$ node
-bash: /usr/local/bin/node: No such file or directory
$ foo
-bash: foo: command not found

차이점이 뭐야? 두 경우 모두, nodefoo유효하지 않은 명령은, 그러나 찾을 수 없습니다 단지 유닉스처럼 보인다 node바이너리를? 예를 들어 프로그램을 제거 할 때 node이를 정리할 수있는 방법이 있습니까?

$ node
-bash: node: command not found

편집하다:

type명령 결과 :

$ type node
node is hashed (/usr/local/bin/node)
$ type foo
-bash: type: foo: not found

당신은 모두의 출력과 질문을 업데이트 할 수 type nodetype foo(아마도 첫 번째 정말 유용하지만).
Eric Renouf

@EricRenouf, 알았어.
gwg 2016 년

2
아마도 'node'는 / usr / bin / node-> / usr / local / bin / node의 심볼릭 링크이고 후자는 사용할 수 없으므로 오류가 발생하여 / usr / local / bin / node가 삭제되었음을 나타냅니다. 심볼릭 링크가 작성된 후
likewhoa 2016 년

답변:


59

이제 그 때문에 bash명령 위치를 기억하는에 저장 해시 테이블.

을 제거한 후에도 node해시 테이블이 지워지지 않고 bash여전히을 ( node/usr/local/bin/node) 찾아서 PATH조회를 건너 뛰고 /usr/local/bin/node를 사용하여 직접 호출 한다고 생각 execve()합니다. 언제부터 node더 이상 존재하지 않습니다, execve()반환 ENOENT오류가 그런 파일이나 디렉토리를 의미합니다, bash당신에게 그 오류를보고했습니다.

에서가 bash, 당신은 해시 테이블에서 항목을 제거 할 수 있습니다 :

hash -d node

또는 전체 해시 테이블을 제거하십시오 ( 모든 POSIX 셸에서 작동 ).

hash -r

2
반드시 빠질 필요는 없습니다 /usr/local/bin/node. 해당 파일이 동적으로 링크 된 실행 파일이고 종속성 중 하나가 누락 된 경우 동일한 "No such file or directory"메시지가 나타납니다. 이것은 당신이 ldd그 파일 을 시도 할 때까지 당신을 미치게 할 수 있습니다.
Guntram Blohm은 Monica

@GuntramBlohm 그러나 일부 Linux 배포판에서 bash는 더 이해하기 쉬운 오류 메시지를 인쇄하도록 패치되어 있습니다 progname: error while loading shared libraries: badLib.so.1: cannot open shared object file: No such file or directory(또는이 특정 경우에는 bash가 아니지만 ld-linux.so).
Ruslan

@Ruslan 내 경험상 "일반 라이브러리"가없는 경우 "공유 라이브러리를로드하는 동안 오류가 발생하고" 동적 링커 자체 가 없는 경우 "해당 파일이나 디렉토리가 없습니다"라는 설명이 표시되지 않습니다 . 당신이 전자의 경우가 감지 것을 깨닫게 때 의미가 있습니다 에 의해 후자의 경우가 커널에 의해 감지되는 반면, 동적 링커, 그것은 도움이 메시지를 인쇄 할 수있는 동적 링커 훨씬 쉽게 ( execve실패 부작용으로 stderr로 쓰기 아마도 POSIX 또는 무언가를 위반했을 것입니다)
zwol

@zwol 아, 맞습니다. 일부 배포판 (예 : CentOS) 패치가 bash입니다. 패치 된 버전은 다음과 같은 오류를 인쇄합니다 /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory.
Ruslan

-6

Ubuntu Linux 16.04에서 "이러한 파일이나 디렉토리가 없음"은 현재 작업 디렉토리를 전환해야 함을 의미하고 "명령을 찾을 수 없음"은 apt-get install xxxyyy_zzz를 사용하여 문제를 해결해야 함을 의미합니다.


10
cwd가 발견되거나 그렇지 않은 것에 영향을 미치는 경우 (./로 접두사를 붙이지 않는 한) PATH는 다소 안전하지 않은 방식으로 설정됩니다. 그리고 찾을 수없는 명령이 항상 고치기 원하는 문제는 아닙니다. :)
rackandboneman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.