为什么内置的BASH命令设置打印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认为函数是变量并打印它们的内容。
答案 0 :(得分:1)
如果您想让set
内置列表不列出shell函数,可以切换到bash
posix模式:
$ set -o posix
$ set
...
虽然未在其手册中记录,但自shellshock漏洞披露bash
将其函数存储为特殊变量以来,这是一个众所周知的事实。