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

在我编写的bash脚本中,我使用source包含在配置文件中定义的变量。要执行的脚本是act.sh,而要提供的脚本是act.conf.sh,因此在act.sh中我有:
source act.conf.sh

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

参见: 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%的时间工作:

It is important to realize that in the general case,this problem has no solution. Any approach you might have heard of,and any approach that will be detailed below,has flaws and will only work in specific cases. First and foremost,try to avoid the problem entirely by not depending on the location of your script!

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

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

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

Nothing that reads $0 will ever be bulletproof,because $0 itself is unreliable.

作为替代,您可以使用$ BASH_SOURCE。这样的东西:

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

这个解决方案也有一些注意事项。查看FAQ页面,看看不同解决方案之间的权衡。他们似乎建议cd与$ BASH_SOURCE结合使用的情况下,它将为您工作,因为你得到一个方便的错误条件,当它无法正常扩展。

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...