7

我可能在一个来自 shell 的 bash 脚本中拥有这个函数

function suman{
     echo "using suman function"
}

如果我打电话

unset suman

事情似乎按预期工作

但是,如果我将此作为我的功能:

function suman-inspect {
     echo "using suman-inspect function"
}

那么如果我打电话

unset suman-inspect

或者

unset "suman-inspect"

我收到这条消息:

bash: unset: `suman-inspect': not a valid identifier

如何按原样取消设置此变量?

4

2 回答 2

6

经过更多研究,似乎

unset -f "suman-inspect"

将工作。这令人惊讶,因为unset suman确实有效,并且确实成功地取消了 suman 函数(据我所知)。

于 2016-11-25T22:29:25.033 回答
2

Bash 允许在不处于 posix 模式时创建名称不是有效标识符的函数。

所以:

set -o posix
function suman-inspect { echo "using suman-inspect function"; }

给出:

bash: `suman-inspect': not a valid identifier

ruak引用了一个有效的观点man bash。源代码 ( builtins/set.def) 有注释: Posix.2 说先尝试变量,然后是函数,但是...

POSIX 标准如果既没有指定 -f 也没有指定 -v,则 name 指的是一个变量如果该名称的变量不存在,则未指定是否应取消设置该名称的函数(如果有)。

所以实际上行为是旧的备用“未指定*。如果有的话,错误在 bash 文档中。但公平地说,它的其他地方man bash说:

可以使用 unset 内置函数的 -f 选项删除函数定义。

于 2016-11-26T08:40:04.957 回答