유닉스는 실행 파일을 어떻게 검색합니까?


45

파일이 실행될 때 유닉스는 어떻게 파일을 검색합니까? 동일한 이름의 PATH에 여러 실행 파일이있는 경우 어떤 파일이 선호됩니까? 파일이 실행될 때 현재 디렉토리가 검색에 포함됩니까?

executable.sh현재 디렉토리에 이름 을 가진 파일이 있다고 가정하십시오 . 그 작업은 실행하면 것인지 $ executed.의 일부가 아닙니다 PATH?


which <executable>이 스레드에서 언급 명령이 유용합니다.
회계사 م

답변:


44

$ PATH는 처음부터 끝까지 검색되며 일치하는 첫 번째 실행 파일이 실행됩니다. 따라서 $ PATH 시작 부분의 디렉토리가 나중에 오는 디렉토리보다 우선합니다. 현재 디렉토리 (.)의 실행 파일은 경우에만 실행됩니다. $ PATH에 있습니다 ( 보통 그렇지 않습니다 ). 검색 경로에 현재 디렉토리가 암시 적으로 포함되어 있지 않습니다.


내 $ PATH에을 포함하지 않는 것이 이상 .하지만 $ PATH 자체에 검사 디렉토리가 정의되기 전에 현재 디렉토리에서 먼저 검색하는 것 같습니다.
Eric Wang

19

현재 디렉토리에있는 파일의 경우 파일 앞에을 추가 ./하여 명령이됩니다 ./executable.sh. .PATH에는 다른 문제 중에서 보안 위험이 있으므로 절대 PATH에 없어야합니다 .

PATH에서 맨 먼저 찾아서 검색 한 디렉토리

올바르게 기억하면 검색 의 전체 순서 는 다음과 같습니다.

  • 별명

  • 내 보낸 함수

  • 내장 쉘 명령

  • PATH의 스크립트 및 바이너리


7
나는 해시를 추가 할 것이다-bash (및 다른 쉘)는 최근에 사용 된 명령의 해시를 유지하여 쉽게 찾을 수 있도록하십시오. hash -rPATH 또는 프로그램 위치를 변경하면을 사용하여 캐시를 제거해야하는 경우가 있습니다.
Rich Homolka

3
검색 순서는 +1입니다. 당신이 :) 정보의 소스 기억할 수 있다면 좋은 일 것입니다
twan163

8

다른 사람들이 잘 대답했지만 몇 가지 생각을 추가하고 싶습니다.

1) PATH는 호출 된 실행 파일에 경로 요소가없는 경우에만 참조됩니다. somecommand $ PATH에서 조회 할 것이다, ./somecommand또는 /usr/bin/somecommand, 또는 ../../bin/somecommand단지 사용 디렉토리 규칙,하지 PATH

동일한 이름의 PATH에 여러 개의 실행 파일이있는 경우 어떤 파일이 선호됩니까?

왼쪽에서 오른쪽으로 $ PATH를 읽고 처음 찾은 지점에서 멈 춥니 다.

파일이 실행될 때 현재 디렉토리가 검색에 포함됩니까?

현재 디렉토리가 PATH에 있으면 검색됩니다. PATH의 빈 디렉토리에는 현재 디렉토리가 포함되어 있습니다. 예를 들어 PATH = : / usr / bin (리딩 비어 있음) PATH = / usr / bin :( 트레일 링 비어 있음) 및 PATH = / usr / bin :: / bin (중간 비어 있음)에는 현재 작업 디렉토리가 모두 효과적으로 포함됩니다.

현재 디렉토리에 executable.sh라는 이름의 파일이 있다고 가정하십시오. 그것이 실행되고 $ 실행되면 작동합니까? PATH의 일부가 아닙니까?

PATH를 검색하여 찾지 못합니다. 현재 디렉토리가 PATH에 없으면 PATH 조회로 찾지 않습니다.

명령을 실행하는 별칭이나 함수가 있으면 실행됩니다. 또는 쉘에 위치 캐시가 있고 실행 파일이 캐시에 있으면 찾을 수 있습니다. 그래서, 그것은 것입니다 결코 PATH에서 찾을 수 없지만 다른 방법으로 실행할 수 있습니다.


cache메모 주셔서 감사 합니다. 거의 실행 파일 /usr/bin/이 여전히 새 실행 파일 이 아닌 호출 된 것으로 미치게 됩니다 /usr/local/bin. 그러나 $PATH로그 아웃하고 다시 로그인 할 때까지 왼쪽에 있습니다.
회계사 م

1
bash의 @theaccountant는 'hash -r'을 사용하여 쉘 캐시를 지울 수 있습니다
Rich Homolka

3

현재 경로가 무엇인지 보려면 echo $PATH, 또는을 입력하십시오 printenv PATH.

그러면 검색 순서를 알 수 있습니다. 이름이 같은 파일이 여러 개인 경우 ____를 실행하여 확인하십시오.

전의.

grep하는 시스템 #>

/ usr / bin / grep

대상처럼 작동하는 파일을 찾는 멋진 방법은 apropos를 사용하는 것입니다.

apropos grep

bzgrep (1)-정규식에 대한 bzip2 압축 파일 검색

egrep (1)-패턴과 일치하는 줄을 인쇄

fgrep (1)-패턴과 일치하는 줄을 인쇄

grep (1)-패턴과 일치하는 줄 인쇄

등등...


2
오 예- 파일의 모든 인스턴스를 찾는 whereis 함수를 잊었습니다 :> whereis grep
mbb

grep : / bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereis이 아닌 하드 코드 된 위치 목록을 사용합니다 $PATH.
grawity

@grawity 당신은 그것을 확장 할 수 있습니까?
WinEunuuchs2Unix 1

-2

@ coneslayer- 실행 파일을 찾는 기본 순서는 현재 경로이며 명령에 내장 된 다음 $ PATH입니다. 따라서 executable이라는 함수가 이미 pwd에 존재하면 그 함수가 실행됩니다.


40 년 전의 Thompson 쉘, Mashey 쉘 또는 다른 화석화 된 이월에 대해 이야기했다면 옳을 것입니다. 그러나 현재 주류 Unix 쉘은 현재 디렉토리를 자동으로 검색하지 않습니다.
Scott

@Scott 따라서 명령에 대한 기본 검색 경로가 먼저 내장 된 다음 $ PATH가되며 ./? 내가 맞아?
proc

별명, 함수 및 내장. 그런 다음 명령 (을 포함하여 ./) 으로 경로를 지정하면 해당 디렉토리 만 검색합니다. 그렇지 않으면를 검색 $PATH합니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.