PATH에 매핑된 상위 디렉토리와 함께 상대 경로를 사용하여 스크립트를 호출하는 방법은 무엇입니까?

PATH에 매핑된 상위 디렉토리와 함께 상대 경로를 사용하여 스크립트를 호출하는 방법은 무엇입니까?

/usr/bin/vendor/규칙에 따라 추가되고 PATH예를 들어 쉘 스크립트가 포함된 폴더가 있습니다 do_something.sh. 이제 함께 그룹화된 하나 이상의 Perl 스크립트를 추가로 저장하기 위해 하위 폴더를 추가하고 싶습니다. /usr/bin/vendor/some_tool/왜냐하면 두 스크립트의 목적은 동일하고 Eclipse 프로젝트 파일, 구성 파일 등을 추가로 관리해야 하기 때문입니다. 결국에는 /usr/bin/vendor/some_tool/do_a.pl/usr/bin/vendor/some_tool/do_b.pl.

때문에 어디서나 PATH쉽게 호출할 수 있습니다 do_something.sh. 하지만 some_tool/do_a.pl같은 방식 으로 호출할 수 있는 방법이 있나요 ? 실제로 some_tool/do_a.pl해당 상대 경로를 사용하면 내가 작업을 수행하고 있음을 알 수 do_a있습니다 some_tool. 상대 dir 구조를 사용하여 구현하고 싶은 표현/명명 규칙과 거의 같습니다.

쉘에서 시도했지만 물론 작동하지 않았습니다. 그러나 아마도 제가 잘못하고 있는 것이 있을 수 있으며 일반적으로 작동해야 합니다. 그러나 나는 그렇게 해서는 안 된다고 생각하며 유일한 해결 방법은 /usr/bin/vendor/some_tool_do_a.sh모든 인수를 /usr/bin/vendor/some_tool/do_a.pl.

답변1

매뉴얼 bash페이지는 다음을 지정합니다.

   PATH   The  search  path for commands.  It is a colon-separated list of
          directories in which the shell looks for commands  (see  COMMAND
          EXECUTION  below).

그 다음에는 이렇게 말합니다.

   If  the name is neither a shell function nor a builtin, and contains no
   slashes, bash searches each element of the PATH for  a  directory  con‐
   taining  an  executable  file  by that name.

따라서 대답은 "아니요, 하려는 작업은 에서 지원되지 않습니다 bash." 인 것 같습니다.

답변2

아니요, 불가능합니다. 입력한 명령의 모든 항목은 항목 내의 상대 경로가 아닌 절대 경로(첫 번째 문자인 경우) 또는 현재 디렉터리에 대한 상대 경로 /로 만듭니다 ./PATH

해결 방법은 모든 스크립트를 다음과 연결하는 것 /usr/bin/vendor/some_tool/입니다 /usr/bin/vendor/.

ln [-s] /usr/bin/vendor/some_tool/* /usr/bin/vendor/

하드 링크나 소프트 링크를 사용할 수 있습니다.

스크립트를 호출할 때 항상 동일한 작업 디렉터리(또는 소수의 디렉터리)에 있는 경우 이(또는 각) 디렉터리에서 상대 링크를 만드는 것이 더 간단한 대답일 수 있습니다.

ln -s /usr/bin/vendor/some_tool .

이 경우 심볼릭 링크를 사용해야 합니다.

다른 해결 방법은 이 기능을 수행하기 위해 짧은 이름으로 스크립트를 정의하는 것입니다. 이 스크립트는 다음과 같이 호출합니다.

tl some_tool/do_a.pl

tl전달된 매개변수를 구문 분석하고 PATH각 구성 요소에서 스크립트를 찾은 다음 스크립트의 전체 경로를 호출합니다.

답변3

"기본" 스크립트에서 수행하는 작업은 다음과 같습니다.

mydir=$(dirname "$0")
"$mydir/subdir/otherscript"

그런 다음 기본 스크립트는 상대 위치가 변경되지 않도록 함께 이동하는 한 항상 하위를 찾습니다.

관련 정보