2016-03-05 97 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 
} 
相關問題