【问题标题】:why does bash set command list functions为什么bash设置命令列表函数
【发布时间】:2015-10-27 21:32:18
【问题描述】:

为什么内置 BASH 命令 set 打印 shell 函数?我在 Google 上的搜索,甚至在 Stack Overflow 上都没有得到令人满意的答案。来自manual page,“如果没有选项,每个 shell 变量的名称和值都会显示......”使用选项不会改变这一点。函数不是变量……是吗?

作为参考,当我使用 set 来测试变量是否存在时,这成为了一个问题:

set_version() {
    if [[ ! $(set | grep -q PKG_VERSION_STAMP) ]]; then
        echo Version not set.  Using default
        PKG_VERSION_STAMP=0.1
    fi
    echo Package Version: $PKG_VERSION_STAMP
}

我在交互式 shell 中测试了条件构造,它可以工作,但那是因为我没有在函数中定义它。我的脚本失败了,因为定义了函数并且 grep 通过了。因此,变量 PKG_VERSION_STAMP 从未被定义。

顺便说一句,从 set 更改为 env 可以解决问题。我只是想知道为什么 BASH 将函数视为变量并打印它们的内容。

【问题讨论】:

  • 这不是测试变量是否存在的好方法。用:-expansion 测试它是否有值(和/或为空)要好得多。或者使用:= 在不存在时为其分配一个值。我找不到任何关于为什么 set 在规范中显示变量的信息。我想知道非 bash shell 是否会这样做。
  • @EtanReisner 哇,谢谢。在此之前,我没有阅读或知道这些扩展。这很有帮助。
  • 问题是:为什么不呢? shell 函数的实现与使用set 显示的shell 变量非常相似。引入另一个用于显示 shell 功能的内置命令(类似于 set)并没有真正的优势。

标签: bash shell


【解决方案1】:

如果您想让set 内置不列出shell 函数,您可以切换到bash posix 模式:

$ set -o posix
$ set
...

虽然没有在其手册中记录,但这是众所周知的事实,因为shellshock 漏洞说明bash 将其函数存储为特殊变量。

【讨论】:

  • 有趣。我没有听说过这个错误,当然也没有在寻找我的问题的答案时偶然发现它(我在发布问题之前做过)。非常感谢。这也来自手册页,“在 posix 模式下,仅列出 shell 变量。”但是,手册页事先明确指出,此内置 仅列出 shell 变量及其值。
猜你喜欢
  • 2013-09-12
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多