我在动物园管理员zkClear.sh
上看到了这个shell脚本。
ZOOBIN="${BASH_SOURCE-$0}"
有人能告诉我这个剧本的意思吗?谢谢。
发布于 2021-02-03 11:35:56
这是一个非常微妙的。虽然在bash中${BASH_SOURCE-$0}
和$BASH_SOURCE
没有显着性差异,但在zsh中获取bash文件变得非常实用。
这里有两个方面:
BASH_SOURCE
的含义及其与$0
的关系:这在来源中得到了很好的解释。但是,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}
是获取源文件路径的简单黑客,它独立于脚本来源的shell (zshvs.bash)。在原始脚本中是否出于这个原因使用这一点尚不确定,但是脚本的作者可能想到了类似的东西,或者被用来编写源文件,这些源文件可以同时用于zsh和bash。
发布于 2021-02-03 09:38:07
${BASH_SOURCE}包含所有调用方案中包含脚本的路径。因此,当您源这个变量时,您将得到bash脚本的路径。
因此,在您的示例中,您将从环境中调用的第一个元素打印为${BASH_SOURCE},该元素输出“bash”(在我的环境中)。
在这里阅读更多的答案:https://stackoverflow.com/a/35006505/12592220
此链接还详细解释了它:https://www.systutorials.com/how-to-get-bash-scripts-own-path/
https://stackoverflow.com/questions/66024681
复制相似问题