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


94

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

source act.conf.sh

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

Answers:


116

请参阅:BASH常见问题解答条目28:“如何确定脚本的位置?我想从同一位置读取一些配置文件。”

任何解决方案都不可能100%地起作用:

重要的是要意识到,在一般情况下,此问题无法解决。您可能听说过的任何方法以及下面将详细介绍的任何方法都存在缺陷,并且仅在特定情况下有效。首先,请尽量不要通过不依赖脚本位置来完全避免该问题!

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

假设您的脚本只能从某些shell运行,并且只需要一点点灵活性,就可以放松一些这种偏执。查看您的选择仍然很好。人们使用的常见模式特别有问题。

特别是,FAQ建议避免使用非常常用的$0变量:

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

另外,您也可以使用$BASH_SOURCE。像这样:

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

此解决方案也有一些警告。请查看FAQ页面,以了解不同解决方案之间的权衡。他们似乎建议cd在可能的$BASH_SOURCE情况下结合使用,因为当它无法正确扩展时会出现一个方便的错误情况。


1
谢谢,我会用readlink。无法确定的关键字搜索这里这么贴的问题....
瑞安李

9
如果bash常见问题发生时,您是否可以将相关信息输入答案?
Merlyn Morgan-Graham

3
Link建议:cd "${BASH_SOURCE%/*}" || exitread somevar < "${BASH_SOURCE%/*}/etc/somefile",Link 强烈劝阻 $0 “读$ 0的任何内容都不是防弹的,因为$ 0本身并不可靠。”
ThorSummoner

10
BASH_SOURCE之后的%/ *是做什么的?
Silicomancer



5

请尝试以下操作:

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.