【问题标题】:The meaning of ${BASH_SOURCE-$0}?${BASH_SOURCE-$0} 的含义?
【发布时间】:2023-04-06 11:50:01
【问题描述】:

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

ZOOBIN="${BASH_SOURCE-$0}"

谁能告诉我这个脚本的含义? 谢谢。

【问题讨论】:

  • 为什么这个问题被关闭了?这是一个有效的问题,要求该符号的含义和微妙之处。
  • 哪部分你不明白? ${...}BASH_SOURCE 是什么意思?
  • ... 或者参数扩展,或者这个特定用例使用这个特定参数扩展的具体原因?
  • BASH_SOURCE-$0 这让我很困惑。我可以在这里将“BASH_SOURCE”视为字符串吗? BASH_SOURCE“减去”$0 是什么意思?

标签: bash


【解决方案1】:

这是一个非常微妙的。虽然在 bash 中 ${BASH_SOURCE-$0}$BASH_SOURCE 之间没有显着差异,但在 zsh 中获取 bash 文件时它变得实用。


这里有两个方面:

  1. 数组BASH_SOURCE 的含义以及它与$0 的关系:这在choosing between $0 and BASH_SOURCE 中有很好的解释。但是,BASH_SOURCE 的值仅在 bash 的上下文中定义。其他 shell 不知道这个数组。

  2. 参数扩展${var-string}:当浏览bash的man page或者任何与POSIX相关的shell比如sh、ksh甚至zsh时,你可以发现${var-string}解析为string如果变量@987654331 @ 不存在。

现在想象以下脚本:

$ 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} 是一种简单的获取源文件路径的技巧,与脚本来源的外壳无关(zsh 与 bash)。是否出于这个原因在原始脚本中使用它并不确定,但是脚本的作者可能有类似的想法,或者用于编写可以在 zsh 和 bash 中使用的源文件。

【讨论】:

  • 非常感谢。现在我明白了这个脚本是如何工作的。
【解决方案2】:

来自bash parameter expansion

[...] 省略冒号会导致仅对未设置的参数进行测试。换句话说,如果包含冒号,则运算符会测试两个参数的存在以及它的值是否不为空;如果省略冒号,则运算符仅测试存在性。

${parameter:-word}

如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。

所以:

ZOOBIN="${BASH_SOURCE-$0}"

所以我们有:

BASH_SOURCE ZOOBIN=
unset $0
set, not empty $BASH_SOURCE
null (set&empty) $BASH_SOURCE, which is null, so ZOOBIN will also be null

null 表示“设置为空”,如var='' 或只是var=

首选使用:-,这样如果变量为空,则使用替代词。我怀疑BASH_SOURCE 是否会被设置但为空,如果设置了它将有一些路径,这段代码就可以了。

BASH_SOURCEbash variables 中有解释。

${BASH_SOURCE-$0}的含义?

含义很大程度上取决于上下文。意思可能是,如果文件是使用bash 获取或运行的,那么更喜欢使用BASH_SOURCE 变量。但是,如果它不是源代码并且不是在 bash 下运行,例如在 ash 中运行,则使用 $0ZOOBIN 这个名字暗示了一些二进制路径,ZOO 可能是一些应用程序前缀。

【讨论】:

  • 感谢您的帮助。这种对参数扩展的解释对我来说是新知识。
【解决方案3】:

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

因此,在您的情况下,当您从环境中调用它时将检索到的第一个元素打印为 ${BASH_SOURCE},它会打印出“bash”(在我的环境中)

在此答案中阅读更多信息:https://stackoverflow.com/a/35006505/12592220

这个链接也有详细解释:https://www.systutorials.com/how-to-get-bash-scripts-own-path/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2017-01-13
    • 1970-01-01
    • 2017-03-21
    • 2017-05-02
    • 2010-10-15
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多