2016-11-25 56 views
6

我可能有一个bash脚本,这个功能被外包给外壳未设置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

一些调查研究后,似乎

unset -f "suman-inspect" 

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

+2

+1引人入胜!unset的文档说:“如果没有提供选项,每个*名称*指的是一个变量;如果没有该名称的变量,则任何具有该名称的函数都将被取消设置。“我假设即使变量不是有效的变量名,但显然不是! – ruakh

+2

可能发生的是' unset *假设它的参数(sans'-f')是一个标识符,但如果没有该名称的变量存在,则检查是否打算取消设置函数。只有当你明确地使用'-f'时''bash'放宽“参数必须是一个有效的标识符”规则。很多'bash'扩展缺少精确的文档描述;其他一些例子包括进程替换(例如,'>(...)'从哪里继承它的标准输出*)和函数导出(参见ShellShock)。 – chepner

+0

suman-inspect中的连字符/短划线是否使其成为无效标识符? –

2

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指定既不也不,名是指一个变量;如果该名称的变量不存在,则不指定该名称的函数是否应该取消设置。

因此,实际上的行为是老待命“未指定*如果有什么事情,错误的是bash的文档中,但说句公道话,在其他地方man bash它说:。

函数定义可能会被删除使用-f选项来取消内置的内存