【发布时间】: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)并没有真正的优势。