unset bash函数变量,带有非标准名称

Ale*_*lls 6 bash sh unset bash-function

我可能在一个bash脚本中有这个函数,它来源于shell

function suman{
     echo "using suman function"
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话

unset suman
Run Code Online (Sandbox Code Playgroud)

事情似乎按预期工作

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

function suman-inspect {
     echo "using suman-inspect function"
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话的话

unset suman-inspect
Run Code Online (Sandbox Code Playgroud)

要么

unset "suman-inspect"
Run Code Online (Sandbox Code Playgroud)

我收到这条消息:

bash: unset: `suman-inspect': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

如何取消设置此变量?

Ale*_*lls 5

经过更多的研究,似乎

unset -f "suman-inspect"
Run Code Online (Sandbox Code Playgroud)

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

  • +1 迷人!`unset` 的文档说“如果没有提供选项,每个 *name* 指一个变量;如果没有这个名字的变量,任何具有这个名字的函数都会被取消设置。” 我认为即使变量不是有效的变量名,这也会起作用,但显然不是! (2认同)
  • 可能发生的情况是`unset` *假定*它的参数(没有`-f`)是一个标识符,但如果不存在该名称的变量,则检查您是否打算取消设置一个函数。仅当您明确使用 `-f` 时,`bash` 才会放宽“参数必须是有效标识符”规则。相当多的`bash` 扩展缺乏对其语义的精确描述;其他一些例子包括进程替换(例如,`>(...)` 从哪里继承其标准的*输出*?)和函数导出(参见ShellShock)。 (2认同)