为什么bash设置命令列表功能

时间:2015-10-27 21:32:18

标签: bash shell

为什么内置的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认为函数是变量并打印它们的内容。

1 个答案:

答案 0 :(得分:1)

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

$ set -o posix
$ set
...

虽然未在其手册中记录,但自shellshock漏洞披露bash将其函数存储为特殊变量以来,这是一个众所周知的事实。