在我写的bash脚本中,我使用source
来包含配置文件中定义的变量。要执行的脚本是act.sh
,而source
d的脚本是act.conf.sh
,所以在act.sh
我有:
source act.conf.sh
但是这仅在包含它的目录中运行act.sh
时才有效,因为act.conf.sh
指的是放在工作目录下的文件。是否有解决方案使其在不调用cd
的情况下引用相对于执行脚本的文件?感谢。
答案 0 :(得分:85)
任何解决方案都无法在100%的时间内发挥作用:
重要的是要意识到在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及下面将详述的任何方法都存在缺陷,并且仅适用于特定情况。首先,尽量不要依赖脚本的位置来避免问题!
如果您需要编写非常可重复使用的工具,那么将正确的路径作为参数添加到您的脚本中将是最可靠的方法。
假设您的脚本只是从某些shell运行,并且只需要一点点灵活性,您可以放松一些这种偏执。看看你的选择仍然很好。人们使用的常见模式尤其成问题。
特别是,FAQ建议避免使用常用的$0
变量:
任何读取
$0
的内容都不会是防弹的,因为$0
本身不可靠。
作为替代方案,您可以使用$BASH_SOURCE
代替。像这样:
source "${BASH_SOURCE%/*}/act.conf.sh"
这个解决方案也有一些注意事项。查看FAQ页面,了解不同解决方案之间的权衡。他们似乎建议将cd
与$BASH_SOURCE
结合使用以适用于您,因为当它无法正常展开时会出现方便的错误情况。
答案 1 :(得分:25)
答案 2 :(得分:4)
尝试以下方法:
source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}
答案 3 :(得分:2)
我通常将其添加到脚本的顶部。
cd $(dirname $BASH_SOURCE)
然后,所有后续代码都相对于该脚本路径执行。