unset bash 具有非标准名称的函数变量

unset bash function variable with non-standard name

我可以在 bash 脚本中使用此函数,该脚本获取 shell

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

如何取消设置这个变量?

经过更多研究,似乎

unset -f "suman-inspect"

会起作用。这是令人惊讶的,因为 unset suman 确实有效,并且成功取消设置了 suman 函数(据我所知)。

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

所以:

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

给出:

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

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

POSIX standard表示如果-f和-v都没有指定,name指的是一个变量;如果不存在具有该名称的变量,则未指定是否应取消设置具有该名称的函数(如果有)。

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

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