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