引用相对于执行脚本的文件

时间:2011-07-12 05:02:06

标签: bash shell

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

source act.conf.sh

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

4 个答案:

答案 0 :(得分:85)

请参阅:BASH FAQ entry #28: "How do I determine the location of my script? I want to read some config files from the same place."

任何解决方案都无法在100%的时间内发挥作用:

  

重要的是要意识到在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及下面将详述的任何方法都存在缺陷,并且仅适用于特定情况。首先,尽量不要依赖脚本的位置来避免问题!

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

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

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

  

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

作为替代方案,您可以使用$BASH_SOURCE代替。像这样:

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

这个解决方案也有一些注意事项。查看FAQ页面,了解不同解决方案之间的权衡。他们似乎建议将cd$BASH_SOURCE结合使用以适用于您,因为当它无法正常展开时会出现方便的错误情况。

答案 1 :(得分:25)

请参阅:Bash: How _best_ to include other scripts?

我建议使用:

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

答案 2 :(得分:4)

尝试以下方法:

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

答案 3 :(得分:2)

我通常将其添加到脚本的顶部。

cd $(dirname $BASH_SOURCE)

然后,所有后续代码都相对于该脚本路径执行。