"bin"에 모듈식 bash 스크립트를 추가하는 방법은 무엇입니까?

"bin"에 모듈식 bash 스크립트를 추가하는 방법은 무엇입니까?

source스크립트를 보다 모듈화하기 위해 사용하는 bash 스크립트가 있습니다 . bin사용자 디렉토리에 복사하는 모습은 다음 과 같습니다.

/bin
    modules/
        script-1
        script-2
        script-3
        script-4
        script-5
    main-app

main-app그러나 자신의 디렉토리가 아닌 다른 디렉토리에서 실행하려는 경우에는 작동하지 않습니다 bin. 이러한 파일을 올바르게 가져올 수 있도록 source ./modules/script-xin을 사용할 수 있는 방법이 있습니까 ? 아니면 파일로 main-app변환해야 하나요 ? main-app정말로 필요한 경우 수동으로 수행해야 합니까, 아니면 일종의 "컴파일러"를 사용해야 합니까?

답변1

사용$0위치 매개변수 및dirname:

#!/bin/bash

echo running "$(dirname "$0")/$(basename "$0")"
source "$(dirname "$0")/modules/script-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"

관련 정보