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