2017-10-31 2 views
0

저는 최근에 몇몇 스크립트를 작업 해왔고 'utils'와 같은 다른 파일의 일부 공통 기능을 분리하고 내 기본 스크립트로 가져 오는 것이 정말 유용하다는 것을 알았습니다. 이를 위해 source ./utils.sh을 사용했습니다. 그러나,이 접근 방식은 내가 메인 스크립트를 호출하는 곳에서 현재 경로에 의존하는 것으로 보인다.파이썬에서와 같은 방식으로 bash에서 모듈을 가져올 수있는 방법이 있습니까?

의 내가이 폴더 구조를 가지고 있다고 가정 해 봅시다 :

scripts/ 
    |-tools/ 
    | |-utils.sh 
    |-main.sh 

main.sh에 :

source ./tools/utils.sh 
some_function_defined_on_utils_sh 
... 

을 나는 모든 것이 잘 작동 main.sh 폴더 scripts/에서 실행합니다. 하지만 다른 디렉토리에서 실행하면 ./scripts/main.sh./tools/utils.sh을 찾을 수 없으므로 스크립트가 실패합니다.

왜 이것이 작동하지 않는지 이해합니다. 내 질문은 내 스크립트에 '모듈'을 가져 오는 다른 메커니즘이 있고 현재의 모든 것을 불가지론 자로 만듭니다 (파이썬 스크립트와 마찬가지로 from utils import some_function_defined_on_utils_sh))

고마워요!

+0

엄밀히 말하면, 아니요. 'source'에 대한 인수는 절대 경로 이름, 상대 경로 (현재 작업 디렉토리에 대한) 경로 이름 또는'PATH' 조회를 통해 발견 된 파일 이름입니다. – chepner

답변

1

모듈을 저장할 적절한 기본 설정으로 환경 변수를 정의한 다음 . (점) 명령을 사용하여 모듈을 읽습니다.

하나의 심각한 옵션은 파일을 이미 PATH에있는 디렉토리에 두는 것입니다. $HOME/bin은 개인 자료의 그럴듯한 후보입니다. 공유 할 자료는 /usr/local/bin입니다. 그렇다면 파일 경로를 지정할 필요조차 없습니다. 그것을 읽을 수 . file-found-on-path 쓸 수 있습니다. 물론 누군가가 PATH 설정을 변경하거나 PATH 이전에 다른 디렉토리에 같은 이름의 파일을 넣으면 결국 엉망이됩니다. 파일은 실행 가능할 필요가 없습니다. 도트 (.) 명령 (또는 Bash/C 셸에서는 source 명령)을 사용하여 읽을 수 있어야합니다. 그 일반적으로 라인을 따라

. ${SHELL_UTILITY_DIR:-/opt/shell/bin}/tools/utils.sh 

또는 무언가 : 같은

또는 좀 더 정확하게 위치를 지정할 수 있습니다. 환경 변수 이름과 기본 위치의 선택은 당신에게 달려 있으며 디렉토리에서 사용하는 하위 구조가 무한히 다양합니다. 단순성과 일관성이 가장 중요합니다. (버전 관리가 문제가되는지 여부를 고려해보십시오. 유틸리티에 대한 업데이트를 어떻게 관리합니까?)

관련 문제