我在 Zookeeper 中看到了这个 shell 脚本zkClear.sh。
ZOOBIN="${BASH_SOURCE-$0}"
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这个脚本的含义?谢谢。
这是非常微妙的。${BASH_SOURCE-$0}虽然 bash和bash之间没有显着差异$BASH_SOURCE,但在 zsh 中获取 bash 文件时它变得很实用。
这里有两个方面:
数组的含义BASH_SOURCE及其关系$0:这在$0 和 BASH_SOURCE 之间的选择中得到了很好的解释。但是, 的值BASH_SOURCE仅在 bash 上下文中定义。其他 shell 不知道该数组。
参数扩展:当浏览sh、ksh 甚至 zsh 等任何 POSIX 相关 shell${var-string}的手册页时,您可以发现如果变量不存在则解析。bash${var-string}stringvar
现在想象一下以下脚本:
$ 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
Run Code Online (Sandbox Code Playgroud)
当您直接在 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
Run Code Online (Sandbox Code Playgroud)
$BASH_SOURCE这清楚地表明和 之间没有显着差异${BASH_SOURCE-$0}。仅当直接从 bash 终端执行时,asBASH_SOURCE不存在并相应地被替换。
从 zsh 来看,情况有所不同。
$ echo "$0, ${BASH_SOURCE}, ${BASH_SOURCE-$0}"
-zsh, , -zsh
$ source src.bash
src.bash, , src.bash
$ ./exe.zsh
./src.bash, , ./src.bash
Run Code Online (Sandbox Code Playgroud)
即使 zsh 不知道该变量BASH_SOURCE,它也会稍微改变$0. 对于 bash,始终是当前执行的脚本的名称,而在 zsh 中,它是当前执行或$0源脚本的名称。在上面,您清楚地看到和之间的区别。后者始终返回当前执行或源文件的值。$BASH_SOURCE${BASH_SOURCE-$0}
总之,可以说这${BASH_SOURCE-$0}是一种获取源文件路径的简单方法,与脚本来源的 shell 无关(zsh 与 bash)。不确定在原始脚本中是否出于这个原因使用它,但是脚本的作者很可能有类似的想法,或者用于编写可在 zsh 和 bash 中使用的源文件。