2009-06-17 97 views
18

我怎麼能確定一個函數在bash腳本已經存在定義的函數?檢查是否從一個bash腳本

我試圖讓系統之間我.bash_login文件腳本便攜,所以我想邏輯添加到它是否只存在調用一個函數。

我想補充__git_ps1()PS1僅當系統上存在的功能。這個函數通常在git-completion.bash中定義,該函數附帶git源代碼,或者由ports/apt安裝的bash完成腳本之一。

回答

10
if type __git_ps1 | grep -q '^function$' 2>/dev/null; then 
    PS1=whatever 
fi 
+0

使用`type`比'declare`快得多 - 謝謝。 – csexton 2009-06-22 13:44:33

+4

這幾乎是正確的,但如果__get_ps1是別名,內建等,它也會返回「true」。使用`if type -t function_name | grep -q「^ function $」;然後... fi`,以確保`__git_ps1`是一個函數。 – 2011-04-05 13:41:36

8

可以使用做到這一點:

type function_name 

將返回你的函數定義在它存在的情況下。所以你可以檢查輸出是否爲空。

PS。更好的是,我剛剛檢查過它會輸出該函數不存在,否則輸出函數體。

4

聲明-F '函數名'>的/ dev/null的

回聲$?

$?如果函數存在,結果爲0,否則爲1

0
if declare -F | grep __git_ps1$ 
then 
    PS1=whatever 
fi 
2

我認爲使用declare更好,即使它比type稍慢。還鍵入路徑中的別名或腳本的suceeds。

我使用這個:

function function_exists 
{ 
    FUNCTION_NAME=$1 

    [ -z "$FUNCTION_NAME" ] && return 1 

    declare -F "$FUNCTION_NAME" > /dev/null 2>&1 

    return $? 
} 

所以在我的劇本後,我可以很容易地看到發生了什麼事情:

if function_exists __git_ps1 
then 
    PS1=__git_ps1 
fi 

甚至仍然可讀的一行:

function_exists __git_ps1 && PS1=__git_ps1 
1

您可以列出所有可用的功能或檢查各個功能與compgen:

help compgen 

compgen -A function 

compgen -A function myfunc 1>/dev/null && echo 'myfunc already exists' || exit 1 
11

我意識到這是一個古老的問題,但其他答案都沒有做到這一點,就像我想的那樣簡單。這使用type -t(正如Chen Levy的評論中所建議的)作爲一種有效的類型測試,但隨後使用shell字符串比較而不是調用grep。

if [ "$(type -t somefunc)" = 'function' ]; then 
    somefunc arg1 arg2 
fi 

並採取了一步,它也可以間接地:

funcname=do_it_special_$somehow 
if [ "$(type -t $funcname)" != 'function' ]; then 
    funcname=do_it_normal 
fi 
$funcname arg1 arg2 
5

如果你需要一個/bin/sh兼容的版本,則不能使用typesetdeclare來測試一個函數的定義,因爲它不是內置的shell。另外,-f選項type可能無法使用在某些系統上。

我目前的解決方案已經在其他的答案被部分覆蓋:

isFunction() { 
    type $1 | head -1 | egrep "^$1.*function\$" >/dev/null 2>&1; 
    return; 
} 

isFunction __git_ps1 && PS1=__git_ps1 
0

注意,busybox的(簡約於一身殼實現,例如在Windows上使用)有「型」,而是「輸入-t」打印錯誤的東西,所以我只是檢查類型的返回值以查看是否有可調用的東西。 busybox也沒有聲明。

相關問題