$PATH에 종속 디렉터리가 있는 프로그램을 추가하는 방법은 무엇입니까?

$PATH에 종속 디렉터리가 있는 프로그램을 추가하는 방법은 무엇입니까?

내 프로그램에 프로그램을 추가하고 싶지만 $PATH해당 코드가 여러 파일로 분할되어 lib/런타임 시 루트 디렉터리에서 가져옵니다.

projectRootDirectory
├ programBinary
└ lib
  ├ someLibrary
  └ someLibrary2

$PATH종속성 누락에 대한 불만을 제기하지 않고 내 프로그램에 이와 같은 것을 어떻게 추가할 수 있습니까 ?


나는 보통 바이너리 파일 /usr/local/bin

  • 복사

    cp /path/to/programBinary /usr/local/bin
    
  • 또는 심볼릭 링크

    cd /usr/local/bin
    ln -s /path/to/programBinary programBinary
    

그러나 둘 다 종속성을 찾을 수 없게 만듭니다.

필요한 파일 중 /usr/local/bin일부도 실행 가능하고 내 $PATH.

어떻게 해야 합니까?

답변1

물론 projectRootDirectory에 추가할 수도 있지만 $PATH여기에는 적어도 두 가지 단점이 있습니다.

  • bin당신이 설명하는 방식에 따르면 이 특정 프로젝트는 다음과 같이 프로젝트를 하위 디렉터리 로 잘 구성하지 않는 것 같습니다 lib.

    projectRootDirectory
    ├ bin
    │ └ programBinary
    └ lib
      ├ someLibrary
      └ someLibrary2
    

    그래서 강제로 projectRootDirectory그 자체에 넣어야 하는데 $PATH, 실행을 위한 바이너리 외에 다른 것이 포함되어 있기 때문에 좀 보기 흉합니다.

  • 비슷한 프로젝트가 많으면 콘텐츠가 $PATH폭발적으로 늘어나 통제할 수 없게 됩니다.

대신, 아마도 이 특별한 경우에 할 수 있는 가장 쉬운 일은 래퍼 실행 파일을 에 넣는 것입니다 /usr/local/bin. 이는 현재 위치에서 "실제" 프로그램을 실행하는 매우 간단한 쉘 스크립트입니다.

#!/bin/sh
exec projectRootDirectory/programBinary "$@"

래퍼 스크립트는 전체 경로 이름을 사용하여 이를 호출하므로 일반적인 방법으로 보조 파일을 찾을 수 있습니다.

답변2

다양한 수준의 복잡성을 지닌 이 문제를 해결하는 방법은 여러 가지가 있으며, 가장 효과적인 방법은 "포장 철학"에 따라 다릅니다.

/usr/local/bin아마도 제가 선택할 접근 방식은 내보낸 변수(라이브러리 경로에 따라 수정됨)를 설정하고 라이브러리 경로에서 기본 프로그램을 호출하는 것 외에는 아무것도 수행하지 않는 래퍼 스크립트를 디렉터리에 배치하는 것 입니다 PATH. 이 경우 모든 실행 파일은 디렉터리에 상주합니다. lib 디렉토리만 가능합니다 /usr/local/bin. (로컬로 정의된 PATH변수는 호출 프로세스에서만 상속되며 호출 환경을 오염시키지 않습니다.)

관련 정보