首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在“bash”中添加一个模块化bash脚本?

如何在“bash”中添加一个模块化bash脚本?
EN

Unix & Linux用户
提问于 2019-05-09 14:49:04
回答 3查看 208关注 0票数 0

我有一个bash脚本,它使用source使脚本更加模块化。下面是将其复制到用户的bin目录中的方式:

代码语言:javascript
复制
/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转换为一个文件?如果我确实需要,我应该手动做这件事,还是我应该使用某种“编译器”?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2019-05-09 15:27:00

使用$0位置参数和dirname

代码语言:javascript
复制
#!/bin/bash

echo running "$(dirname "$0")/$(basename "$0")"
source "$(dirname "$0")/modules/script-1"
票数 2
EN

Unix & Linux用户

发布于 2019-05-09 15:29:35

您必须提取脚本的真实路径,然后获取模块:

代码语言:javascript
复制
#!/bin/bash

FULLPATH_OF_MAIN=`realpath $BASH_SOURCE`
SOURCEDIR=`dirname ${FULLPATH_OF_MAIN}`

source ${SOURCEDIR}/modules/script-x
票数 1
EN

Unix & Linux用户

发布于 2019-05-09 15:51:21

在目录中使用点(.)使它们相对于点“此目录”(pwd)。

如果您不介意静态目录(相对于用户dir (~)),可以使用:

代码语言:javascript
复制
source ~/bin/modules/script-x     # or equivalent: . ~/bin/modules/script-x

如果您需要相对于启动main-app的目录(任何目录)使用目录(在bash中):

代码语言:javascript
复制
source "${BASH_SOURCE%/*}/modules/script-x"

或者,在许多贝壳中:

代码语言:javascript
复制
source "$(basename "$0")/modules/script-x"

假定调用主应用程序的方式,$0将工作,这将使ps列出的名称包含文件的正确路径。情况并非总是如此:

代码语言:javascript
复制
$ exec -atestname /bin/bash
$ echo "$0"
testname

如果您的目录可能包含链接,并且需要规范路径(没有链接或相对(.))然后使用:

代码语言:javascript
复制
source "$(basename "$(readlink -f -- "$BASH_SOURCE")" )/modules/script-x"

或将"$BASH_SOURCE"替换为"$0" (如果需要)。

注意:在一些角落的案件中,您实际上可能需要使用realpath而不是readlink -f

或者只是指向正确目录的cd (避免readlink或realpath):

代码语言:javascript
复制
source "$( cd "${BASH_SOURCE%/*}" > /dev/null && pwd )/modules/script-x"
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/518007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档