PATH의 서로 다른 위치에 동일한 이름을 가진 바이너리가 여러 개 있는 경우 사양에 따라 어떤 바이너리가 사용됩니까?

PATH의 서로 다른 위치에 동일한 이름을 가진 바이너리가 여러 개 있는 경우 사양에 따라 어떤 바이너리가 사용됩니까?

PATH 환경 변수의 서로 다른 두 디렉터리에 모두 동일한 이름의 바이너리가 포함되어 있지만(그러나 약간 다르게 동작하는 경우) 어느 것을 사용할지에 대한 사양/보증이 있습니까?

which <binary name>내 컴퓨터(macOS Monterey, Darwin 21.2.0)에서는 PATH에 있는 첫 번째 디렉터리에서 바이너리가 선택되는 것을 관찰했습니다 (해당 내용은 왼쪽에서 오른쪽으로 읽음). 그러나 이것이 모든 Linux/UNIX 운영 체제에 대한 표준 동작입니까? 즉, 일부 강제 표준(예: POSIX)이 있습니까?

추가 내용(궁금하신 분들을 위해): 저는 프로젝트별 폴더에 있는 표준 바이너리의 사용자 정의 버전을 다운로드한 다음 일반 바이너리 대신 사용자 정의 바이너리를 사용해야 하는 다른 스크립트를 호출하는 스크립트가 있는 프로젝트를 작성 중입니다. 두 번째 스크립트를 호출하기 전에 사용자 지정 바이너리가 포함된 폴더를 PATH에 추가합니다. 충돌이 발생할 때 PATH를 검색하는 방식을 관찰한 결과 PATH PATH=<my-custom-folder>:$PATH대신 PATH를 설정했습니다 PATH=$PATH:<my-custom-folder>. 하지만 이 프로젝트에는 여러 공동 작업자가 있으며 모두 동일한 바이너리를 실행하고 있는지 확인하고 싶습니다. 다른 운영 체제가 나와 다르게 PATH를 검색하면 문제가 발생합니다.

답변1

POSIX 정의 라이브러리 호출execlp(3)그리고execvp(3)PATH지정된 실행 파일의 위치 에 대한 환경 변수를 검색합니다 . (실행 파일이 /bin/ls또는 와 같이 이름에 대한 상대 또는 절대 경로를 지정하지 않는 한 ./a.out)

이것POSIX 정의PATH그런 것인가,

이 변수는 파일 이름으로만 알려진 실행 파일을 검색할 때 특정 기능 및 유틸리티가 적용하는 일련의 경로 접두사를 나타내야 합니다. 접두사는 ( ':' )로 구분해야 합니다. […]목록은 처음부터 끝까지 검색되어야 합니다., 지정된 이름과 적절한 실행 권한을 가진 실행 파일이 발견될 때까지 각 접두사에 파일 이름을 적용합니다.

POSIX 쉘도 따라야 한다(파트 1e) 이 접근 방식은 검색을 함수 $PATH중 하나로 직접 연기하지 않더라도 마찬가지입니다 .exec(3)

따라서 귀하의 질문에 직접 대답하기 위해, 규정되지 않은 명령(예: ls)이 있는 경우 목록에 지정된 디렉토리에 있는 첫 번째 실행 파일이 사용됩니다 $PATH. 스크립트는 실행 가능하므로 바이너리 파일일 필요는 없습니다. (경로 이름에 명령이 /포함되어 있으면 현재 디렉터리가 상대 경로 이름의 시작점이 되어 직접 사용됩니다.)

잠재적인 요구 사항에 대해 더 많이 생각해 보십시오. 어쩌면 MYAPP_DIR애플리케이션 실행 파일이 저장된 디렉터리를 가리키는 자체 환경 변수(예:)를 정의해야 할 수도 있습니다 . 그러면 항상 $MYAPP_DIR/myutility사용자의 정확성에 의존하는 대신 동등한 것을 호출할 수 있습니다 .$PATH

관련 정보