Function 如何确定POSIX shell中是否存在函数?

Function 如何确定POSIX shell中是否存在函数?,function,shell,sh,posix,Function,Shell,Sh,Posix,这与问题基本相同,只是这次不是针对Bash,而是针对: 如何确定具有给定名称的shell函数是否存在 POSIX似乎没有强制执行像type这样的典型内置,因此这件事更加困难,甚至可能是不可能的。POSIX(更准确地说)指定了命令。它没有说明type命令应该返回什么来告诉参数是什么。但是,该标准表示,它通常标识操作数,因此类型实现在传递函数名时不在其应答中包含字符串“function”的可能性很小 这应该适用于大多数(如果不是全部)符合POSIX的shell: isFunction() {

这与问题基本相同,只是这次不是针对Bash,而是针对:

如何确定具有给定名称的shell函数是否存在

POSIX似乎没有强制执行像
type
这样的典型内置,因此这件事更加困难,甚至可能是不可能的。

POSIX(更准确地说)指定了命令。它没有说明
type
命令应该返回什么来告诉参数是什么。但是,该标准表示,它通常标识操作数,因此
类型
实现在传递函数名时不在其应答中包含字符串“function”的可能性很小

这应该适用于大多数(如果不是全部)符合POSIX的shell:

isFunction()
{
    type "$1" | sed "s/$1//" | grep -qwi function
} 
您也可以在此处运行
command-V
而不是
type
,并对未指定的输出格式进行相同的注释。我从来没有这样做过,因为前者打字时间更短,更容易记忆。但是,如果您运行一个决定不包含XSI的shell(可能是
posh
),这将是强制性的,也就是说,一个shell通过将它试图遵守的实用程序限制在严格的POSIX集合中,从而破坏了许多现有脚本的可移植性。

您可以在实现2013版POSIX的shell中使用它,或旧规范的用户可移植性实用程序选项:

isFunction() { 
  command -V "$1" 2>/dev/null | grep -qwi function
}
但是,请注意,规范实际上并没有规定命令输出的形式。它要求将函数标识为函数,因此当且仅当请求的名称是函数时,输出极有可能包含单词
function
,但没有严格保证。上述解决方案很容易被愚弄(见@jiliagre的评论)


规范的另一部分要求命令执行几乎相同的操作(对于未指定的输出格式有相同的警告)。奇怪的是,它没有被列为shell内置所需的命令之一,但正如信息注释所说,它必须是一个,才能按规定工作。

为了完整性:可以使用
type
command-V
,而无需生成任何额外的子进程,如
sed
grep
(尽管您仍然需要为
$(type…
)生成一个子进程:


你能解释一下“没有一个典型的内置类型”是什么意思吗?我试图从opengroup链接POSIX规范,但之前显然弄乱了复制缓冲区。所以现在“posixshell”链接指向该规范,该规范解释了什么是内置的,并且该类型不是必需的类型之一。您可以编写一个完全没有
类型的POSIX shell。您能指出规范文档中要求存在
类型的部分吗?
别名函数=date;isFunction函数
;-)稍微拆分头发,但是
“$(…)”
会创建一个子shell,它是subprocess@NickBull哈,对。我的意思是你产生的进程更少。
is_function() {
    case "$(type -- "$1" 2>/dev/null)" in
        *function*) return 0 ;;
    esac
    return 1
}