在我正在编写的bash脚本中,我source
用来包括配置文件中定义的变量。要执行act.sh
的脚本是,而要执行的脚本source
是act.conf.sh
,所以act.sh
我有:
source act.conf.sh
但是,这仅act.sh
在包含它的目录中运行时才有效,因为act.conf.sh
那里是指放置在工作目录下的文件。有没有一种解决方案可以使它在不调用的情况下引用相对于执行脚本的文件cd
?谢谢。
Answers:
请参阅:BASH常见问题解答条目28:“如何确定脚本的位置?我想从同一位置读取一些配置文件。”
任何解决方案都不可能100%地起作用:
重要的是要意识到,在一般情况下,此问题无法解决。您可能听说过的任何方法以及下面将详细介绍的任何方法都存在缺陷,并且仅在特定情况下有效。首先,请尽量不要通过不依赖脚本位置来完全避免该问题!
如果您需要编写一个非常可重用的工具,那么将正确的路径作为脚本的参数将是最可靠的方法。
假设您的脚本只能从某些shell运行,并且只需要一点点灵活性,就可以放松一些这种偏执。查看您的选择仍然很好。人们使用的常见模式特别有问题。
特别是,FAQ建议避免使用非常常用的$0
变量:
读取的任何内容
$0
都不会是防弹的,因为$0
它本身是不可靠的。
另外,您也可以使用$BASH_SOURCE
。像这样:
source "${BASH_SOURCE%/*}/act.conf.sh"
此解决方案也有一些警告。请查看FAQ页面,以了解不同解决方案之间的权衡。他们似乎建议cd
在可能的$BASH_SOURCE
情况下结合使用,因为当它无法正确扩展时会出现一个方便的错误情况。
cd "${BASH_SOURCE%/*}" || exit
或read somevar < "${BASH_SOURCE%/*}/etc/somefile"
,Link 强烈劝阻 $0
“读$ 0的任何内容都不是防弹的,因为$ 0本身并不可靠。”
$0
本质上是越野车。有关原因的信息,请参阅投票数最高且被接受的答案,或者直接阅读mywiki.wooledge.org/BashFAQ/028-所提问题的简短解决方法是source "${BASH_SOURCE%/*}/act.conf.sh"
readlink
。无法确定的关键字搜索这里这么贴的问题....