我在ZookeeperzkClear.sh
中看到了这个shell脚本。
ZOOBIN="${BASH_SOURCE-$0}"
谁能告诉我这个脚本的意思?谢谢。
这是非常微妙的。虽然在bash中${BASH_SOURCE-$0}
和$BASH_SOURCE
之间没有明显的区别,但是当在zsh中查找bash文件时,它变得很实用。
这里有两个方面:
-
数组
BASH_SOURCE
的含义及其与$0
的关系:在$0和BASH_SOURCE之间的选择中很好地解释了这一点。但是,BASH_SOURCE
的值仅在bash上下文中定义。其他shell不知道这个数组。 -
参数扩展
${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[0]}包含所有调用场景中包含脚本的路径。因此,当您获取这个变量的源代码时,您将获得bash脚本的路径。
因此,在您的示例中,您将从环境中调用检索到的第一个元素打印为${BASH_SOURCE},它将打印出"bash"(在我的环境中)
在这个答案中阅读更多内容:https://stackoverflow.com/a/35006505/12592220
这个链接也解释了它的细节:https://www.systutorials.com/how-to-get-bash-scripts-own-path/