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

Rya*_* Li 78 bash shell

在我写的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它,因为当它无法正常扩展时,你会得到一个方便的错误条件.

  • 如果bash faq发生故障,您能否将相关信息提取到答案中? (8认同)
  • BASH_SOURCE之后的%/*做了什么以及如何做? (7认同)
  • 链接建议:`cd"$ {BASH_SOURCE%/*}"|| 退出`,或`读取somevar <"$ {BASH_SOURCE%/*}/etc/somefile"`,链接*强烈劝阻*`$ 0`"任何读取$ 0的东西都不会是防弹的,因为$ 0本身是不可靠的." (3认同)

vag*_*kym 29

看到:Bash:如何_best_包含其他脚本?

我建议使用:

source $(dirname $0)/act.conf.sh
Run Code Online (Sandbox Code Playgroud)

  • 这不是你寻求的答案.`$ 0`本来就是马车.请参阅顶部投票和接受的答案为什么,或者只是阅读http://mywiki.wooledge.org/BashFAQ/028-问题的简短解决方法就像`来源'$ {BASH_SOURCE%/*}/act.conf .SH"` (7认同)

Gay*_*tti 7

将此添加到脚本之上。然后,所有后续代码都将相对于脚本的位置执行。

cd "$(dirname "${BASH_SOURCE[0]}")"
Run Code Online (Sandbox Code Playgroud)


Clu*_*ess 5

请尝试以下操作:

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}
Run Code Online (Sandbox Code Playgroud)