The meaning of ${BASH_SOURCE-$0}?



我在ZookeeperzkClear.sh中看到了这个shell脚本。

ZOOBIN="${BASH_SOURCE-$0}"

谁能告诉我这个脚本的意思?谢谢。

这是非常微妙的。虽然在bash中${BASH_SOURCE-$0}$BASH_SOURCE之间没有明显的区别,但是当在zsh中查找bash文件时,它变得很实用。


这里有两个方面:

  1. 数组BASH_SOURCE的含义及其与$0的关系:在$0和BASH_SOURCE之间的选择中很好地解释了这一点。但是,BASH_SOURCE的值仅在bash上下文中定义。其他shell不知道这个数组。

  2. 参数扩展${var-string}:在浏览bash或任何POSIX相关的shell(如sh、ksh甚至zsh)的手册页时,如果变量var不存在,可以发现${var-string}string中解析。

现在想象一下下面的脚本:

$ cat src.bash
#!/usr/bin/env bash
echo "$0, ${BASH_SOURCE}, ${BASH_SOURCE-$0}"
$ cat exe.bash
#!/usr/bin/env bash
source ./src.bash
$ cat exe.zsh
#!/usr/bin/env zsh
source ./src.bash

当您直接在bash中执行这些脚本时,将得到以下结果:

$ echo "$0, ${BASH_SOURCE}, ${BASH_SOURCE-$0}"
bash, , bash
$ source src.bash
bash, src.bash, src.bash
$ ./exe.bash
./exe.bash, ./src.bash, ./src.bash

这清楚地表明$BASH_SOURCE${BASH_SOURCE-$0}之间没有显著差异。只有在直接从bash终端执行时,因为BASH_SOURCE不存在,因此被替换。

从zsh,故事是不同的。

$ echo "$0, ${BASH_SOURCE}, ${BASH_SOURCE-$0}"
-zsh, , -zsh
$ source src.bash
src.bash, , src.bash
$ ./exe.zsh
./src.bash, , ./src.bash

即使zsh不知道变量BASH_SOURCE,它也稍微改变了$0的行为。对于bash,$0总是当前执行的脚本的名称,而在zsh中,它是当前执行的的名称。的脚本。在上面,您可以清楚地看到$BASH_SOURCE${BASH_SOURCE-$0}之间的区别。后者总是返回当前执行的或源文件的值。

在结论,可以说${BASH_SOURCE-$0}是一个简单的hack,可以获得源文件的路径,而不依赖于脚本来自的shell (zsh vs bash)。在最初的脚本中是否出于这个原因使用它是不确定的,但是很可能脚本的作者有这样的想法,或者用来编写可以在zsh和bash中使用的源文件。

从bash参数展开:

[…省略冒号只会对未设置的参数进行测试。换句话说,如果包含冒号,操作符将测试两个参数是否存在,并且其值是否为空;如果省略冒号,则操作符只测试是否存在。

${parameter:-word}

如果parameter未设置或为空,则替换字的展开部分。否则,替换parameter的值。

:

ZOOBIN="${BASH_SOURCE-$0}"

我们有:

<表类> BASH_SOURCE ZOOBIN = tbody><<tr>设置0集非空美元BASH_SOURCEnull (set∅$BASH_SOURCE,它是空的,所以ZOOBIN也将是空的

${BASH_SOURCE[0]}包含所有调用场景中包含脚本的路径。因此,当您获取这个变量的源代码时,您将获得bash脚本的路径。

因此,在您的示例中,您将从环境中调用检索到的第一个元素打印为${BASH_SOURCE},它将打印出"bash"(在我的环境中)

在这个答案中阅读更多内容:https://stackoverflow.com/a/35006505/12592220

这个链接也解释了它的细节:https://www.systutorials.com/how-to-get-bash-scripts-own-path/

相关内容

最新更新