我有一个bash脚本,它使用source使脚本更加模块化。下面是将其复制到用户的bin目录中的方式:
/bin
modules/
script-1
script-2
script-3
script-4
script-5
main-app但是,如果您想要从您的main-app目录以外的目录执行bin,这是行不通的。有没有一种方法可以在source ./modules/script-x中使用main-app,以便我能够正确地查找这些文件?还是应该将main-app转换为一个文件?如果我确实需要,我应该手动做这件事,还是我应该使用某种“编译器”?
发布于 2019-05-09 15:27:00
发布于 2019-05-09 15:29:35
您必须提取脚本的真实路径,然后获取模块:
#!/bin/bash
FULLPATH_OF_MAIN=`realpath $BASH_SOURCE`
SOURCEDIR=`dirname ${FULLPATH_OF_MAIN}`
source ${SOURCEDIR}/modules/script-x发布于 2019-05-09 15:51:21
在目录中使用点(.)使它们相对于点“此目录”(pwd)。
如果您不介意静态目录(相对于用户dir (~)),可以使用:
source ~/bin/modules/script-x # or equivalent: . ~/bin/modules/script-x如果您需要相对于启动main-app的目录(任何目录)使用目录(在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"https://unix.stackexchange.com/questions/518007
复制相似问题