這基本上是作爲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。 –