引用与执行脚本相关的文件

在我正在编写的 bash 脚本中,我使用 source来包含在配置文件中定义的变量。要执行的脚本是 act.sh,而 sourced 的脚本是 act.conf.sh,所以在 act.sh中我有:

source act.conf.sh

不过,这只适用于在包含它的目录中运行 act.sh的情况,因为这里的 act.conf.sh指的是放置在工作目录下的文件。有没有一种解决方案,使它引用相对于执行脚本的文件,而不调用 cd?谢谢。

82293 次浏览

见: BASH FAQ 条目 # 28: “我如何确定我的脚本的位置?我想从同一个地方读取一些配置文件。”

任何解决方案都不会100% 奏效:

重要的是要认识到,在一般情况下,这个问题没有解决办法。您可能听说过的任何方法,以及下面将详细介绍的任何方法都有缺陷,并且只在特定情况下有效。首先也是最重要的一点,不要依赖于脚本的位置来完全避免这个问题!

如果您需要编写一个 非常可重用的工具,那么 将正确的路径作为脚本的参数将是最可靠的方法

假设您的脚本只在特定的 shell 中运行,并且只需要一点灵活性,那么您可能会放松一些疑虑。看看你的选择还是不错的。人们使用的一些常见模式特别有问题。

特别是,常见问题解答建议避免使用非常常用的 $0变量:

读取 $0的任何东西都不会是防弹的,因为 $0本身是不可靠的。

作为一种替代方法,你可以使用 $BASH_SOURCE:

source "${BASH_SOURCE%/*}/act.conf.sh"

对于这种解决方案也有一些警告。查看 FAQ 页面,了解不同解决方案之间的权衡。他们似乎推荐将 cd$BASH_SOURCE结合使用,因为当 cd无法正确展开时,您会得到一个方便的错误条件。

试试以下方法:

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}

看这个: 如何最好地包含其他脚本?

我建议使用:

source $(dirname $0)/act.conf.sh

在脚本的顶部添加这个。然后,所有后续代码将相对于脚本的位置执行。

cd "$(dirname "${BASH_SOURCE[0]}")"