source
스크립트를 보다 모듈화하기 위해 사용하는 bash 스크립트가 있습니다 . bin
사용자 디렉토리에 복사하는 모습은 다음 과 같습니다.
/bin
modules/
script-1
script-2
script-3
script-4
script-5
main-app
main-app
그러나 자신의 디렉토리가 아닌 다른 디렉토리에서 실행하려는 경우에는 작동하지 않습니다 bin
. 이러한 파일을 올바르게 가져올 수 있도록 source ./modules/script-x
in을 사용할 수 있는 방법이 있습니까 ? 아니면 파일로 main-app
변환해야 하나요 ? main-app
정말로 필요한 경우 수동으로 수행해야 합니까, 아니면 일종의 "컴파일러"를 사용해야 합니까?
답변1
답변2
스크립트의 실제 경로를 추출한 다음 모듈을 가져와야 합니다.
#!/bin/bash
FULLPATH_OF_MAIN=`realpath $BASH_SOURCE`
SOURCEDIR=`dirname ${FULLPATH_OF_MAIN}`
source ${SOURCEDIR}/modules/script-x
답변3
.
디렉토리에 점( )을 사용하면 점 "이 디렉토리"(pwd)를 기준으로 합니다.
(사용자 디렉터리(~)에 상대적인) 정적 디렉터리가 마음에 들지 않으면 다음을 사용할 수 있습니다.
source ~/bin/modules/script-x # or equivalent: . ~/bin/modules/script-x
기본 앱 시작 디렉터리(모든 디렉터리)와 관련된 디렉터리가 필요한 경우 bash에서 다음을 사용할 수 있습니다.
source "${BASH_SOURCE%/*}/modules/script-x"
또는 많은 쉘에서:
source "$(basename "$0")/modules/script-x"
$0
이는 ps에 나열된 이름에 파일에 대한 올바른 경로가 포함되는 방식으로 기본 응용 프로그램이 호출된다고 가정하면 작동합니다. 그러나 항상 그런 것은 아닙니다.
$ exec -atestname /bin/bash
$ echo "$0"
testname
디렉터리에 링크가 포함되어 있고 표준 경로(링크 또는 상대(..) 이름을 사용하지 않고)가 필요한 경우 다음을 사용하세요.
source "$(basename "$(readlink -f -- "$BASH_SOURCE")" )/modules/script-x"
또는 (필요한 경우) "$BASH_SOURCE"
로 교체하십시오."$0"
참고: 즉시일부 극단적인 경우realpath
실제로 대신 사용해야 할 수도 있습니다 .readlink -f
아니면 cd
올바른 디렉터리로 이동하세요(readlink 또는 realpath 제외).
source "$( cd "${BASH_SOURCE%/*}" > /dev/null && pwd )/modules/script-x"