2016-03-05 96 views
2

这基本上是作为Determine if a function exists in bash同样的问题,只是这一次它不是瞄准击,但在a POSIX shell如何确定函数是否存在于POSIX shell中?

如何确定与一个给定名称的shell函数是否存在?

POSIX强制要求没有像type这样的典型内置插件,所以这件事情更加困难或者甚至是不可能的。

+0

你能澄清你的意思“因此没有典型建宏样型”是什么? – jlliagre

+0

我试图从opengroup链接POSIX规范,但是显然早先已经搞糟了复制缓冲区。因此,现在“POSIX shell”链接指向规范,该规范说明了什么是内置插件,并且该类型不是必需的之一。你可以写一个没有'type'的POSIX shell。 –

回答

4

可以在实现了2013版POSIX的,或旧规范的用户便携工具选项壳使用command此:

isFunction() { 
    command -V "$1" 2>/dev/null | grep -qwi function 
} 

但是,请注意,该规范并不实际支配命令输出的形式。它要求功能被识别,所以当且仅当请求的名称是一个功能时,输出包括字function的可能性很大,但它不是严格保证的。上述解决方案很容易被愚弄(参见@ jiliagre的评论)。

该规范的不同部分要求type命令执行非常相同的操作(对未指定的输出格式也有相同的注意事项)。奇怪的是,它并没有被列为内建shell所需的命令之一,但正如信息说明所说,为了按照规定工作,它几乎必须是一个。

+1

这可以被'别名函数=日期; isFunction函数';-) – jlliagre

3

POSIX(更确切地说X/Open Portability Guide)指定type命令。它没有说明type命令应该返回什么来说明参数是什么。然而,标准说它通常标识操作数,所以当传递一个函数名时,一个type实现不会在其答复中包含字符串“function”。

那么这应该与大多数工作,如果不是全部,符合POSIX壳:

isFunction() 
{ 
    type "$1" | sed "s/$1//" | grep -qwi function 
} 

您也可能会遇到的command -V代替type这里,关于未指定的输出格式相同的注释。我从来没有这样做过,因为前者键入的时间更短,更易于记忆。但是,如果运行一个决定不包含XSI的shell(可能是posh),那么这将是强制性的,也就是说,通过限制它试图遵循严格的POSIX集的实用程序来限制许多现有脚本的可移植性的shell。

+0

您可以指向规范文档中规定存在'type'的部分吗? –

+1

@HelmutGrohne XSI强制使用'type'命令。 – jlliagre

0

为了完整起见:它是可以使用typecommand -V没有产卵任何额外的子进程像sedgrep

is_function() { 
    case "$(type "$1" 2>/dev/null)" in 
     *function*) return 0 ;; 
    esac 
    return 1 
} 
相关问题