这基本上是作为Determine if a function exists in bash同样的问题,只是这一次它不是瞄准击,但在a POSIX shell:如何确定函数是否存在于POSIX shell中?
如何确定与一个给定名称的shell函数是否存在?
POSIX强制要求没有像type
这样的典型内置插件,所以这件事情更加困难或者甚至是不可能的。
这基本上是作为Determine if a function exists in bash同样的问题,只是这一次它不是瞄准击,但在a POSIX shell:如何确定函数是否存在于POSIX shell中?
如何确定与一个给定名称的shell函数是否存在?
POSIX强制要求没有像type
这样的典型内置插件,所以这件事情更加困难或者甚至是不可能的。
可以在实现了2013版POSIX的,或旧规范的用户便携工具选项壳使用command
此:
isFunction() {
command -V "$1" 2>/dev/null | grep -qwi function
}
但是,请注意,该规范并不实际支配命令输出的形式。它要求功能被识别,所以当且仅当请求的名称是一个功能时,输出包括字function
的可能性很大,但它不是严格保证的。上述解决方案很容易被愚弄(参见@ jiliagre的评论)。
该规范的不同部分要求type
命令执行非常相同的操作(对未指定的输出格式也有相同的注意事项)。奇怪的是,它并没有被列为内建shell所需的命令之一,但正如信息说明所说,为了按照规定工作,它几乎必须是一个。
这可以被'别名函数=日期; isFunction函数';-) – jlliagre
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。
您可以指向规范文档中规定存在'type'的部分吗? –
@HelmutGrohne XSI强制使用'type'命令。 – jlliagre
为了完整起见:它是可以使用type
或command -V
没有产卵任何额外的子进程像sed
或grep
:
is_function() {
case "$(type "$1" 2>/dev/null)" in
*function*) return 0 ;;
esac
return 1
}
你能澄清你的意思“因此没有典型建宏样型”是什么? – jlliagre
我试图从opengroup链接POSIX规范,但是显然早先已经搞糟了复制缓冲区。因此,现在“POSIX shell”链接指向规范,该规范说明了什么是内置插件,并且该类型不是必需的之一。你可以写一个没有'type'的POSIX shell。 –