首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >${BASH_SOURCE-$0}的含义?

${BASH_SOURCE-$0}的含义?
EN

Stack Overflow用户
提问于 2021-02-03 09:33:13
回答 2查看 1.5K关注 0票数 1

我在动物园管理员zkClear.sh上看到了这个shell脚本。

代码语言:javascript
运行
复制
ZOOBIN="${BASH_SOURCE-$0}"

有人能告诉我这个剧本的意思吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-03 11:35:56

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

这里有两个方面:

  1. 数组BASH_SOURCE的含义及其与$0的关系:这在来源中得到了很好的解释。但是,BASH_SOURCE的值仅在bash上下文中定义。其他shell不知道这个数组。
  2. 参数扩展${var-string}:当浏览bash的手册页或任何与POSIX相关的shell (如sh、ksh甚至zsh )时,如果变量var不存在,您可以发现${var-string}string中解析。

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

代码语言:javascript
运行
复制
$ 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中直接执行这些脚本时,会得到以下结果:

代码语言:javascript
运行
复制
$ 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不同的是故事。

代码语言:javascript
运行
复制
$ 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。

票数 4
EN

Stack Overflow用户

发布于 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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66024681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档