如何使用相对路径包含bash脚本?

14

我有三个脚本:

脚本A:

echo "Hey you!"

脚本 B:

source ./A.sh

脚本 C:

source ./libs/B.sh

因此,位于文件夹“libs”中的脚本A和B以及脚本C使用该目录中的脚本B。

脚本C抛出错误:

./libs/B.sh: line 1: ./A.sh: 没有那个文件或目录

如何在这种情况下正确使用“包含”脚本?

我理解为什么会发生这种错误,但我不知道如何修复它。 另外!我不想使用完整路径进行包含,比如/home/.../libs/A.sh等。 我想创建无需永久编辑即可自由移动的脚本。


从开头删除 ./. <scriptname>source <scriptname> 是同一件事。正如您提到的,脚本 A 和 B 在 libs 目录中,我假设脚本 C 也在同一个目录中,如果所有三个脚本都驻留在同一个目录中,则不需要使用 ./ - Gaurav Pathak
如果在 $PATH 中找到了 scriptname,则会使用该文件而不是当前目录中的文件。 - tokland
1个回答

20

你可以指定脚本本身的目录。默认情况下,一个点表示"当前工作目录"。

脚本B,修改版本:

source "$(dirname "$0")/A.sh"

建议在 C 中使用相同的模块:

source "$(dirname "$0")/libs/B.sh"

你可以使用${0##*/}来替代$(dirname "$0"),达到相同的效果。

或者,为了确保是脚本的全路径,可以使用${BASH_SOURCE[0]}

修改后的B脚本:

source "$(dirname "${BASH_SOURCE[0]}")/A.sh"

1
谢谢!还有这个:
source "$(dirname "$0")/libs/B.sh" 不起作用。 但是这个: source "$(dirname "${BASH_SOURCE[0]}")/A.sh" 工作正常。
- Kirill Rud
如果你有../B.sh而不是./libs/B.sh会怎么样? - Erwann
1
@Erwann 系统会为您解决这个问题,所以请放心使用 $(dirname "$0")/../B.sh - iBug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接