233 Stimmen

Feststellen, ob eine Funktion in der Bash existiert

Derzeit mache ich einige Unit-Tests, die von Bash ausgeführt werden. Unit-Tests werden in einem Bash-Skript initialisiert, ausgeführt und bereinigt. Dieses Skript enthält normalerweise die Funktionen init(), execute() und cleanup(). Aber sie sind nicht zwingend erforderlich. Ich würde gerne testen, ob sie definiert sind oder nicht.

Ich habe dies bisher durch Greping und Seding des Quelltextes gemacht, aber es schien falsch zu sein. Gibt es einen eleganteren Weg, dies zu tun?

Edit: Das folgende Sniplet funktioniert wie ein Zauber:

fn_exists()
{
    LC_ALL=C type $1 | grep -q 'shell function'
}

0 Stimmen

Danke. Ich habe dies verwendet, um beim Laden einer Shell-Bibliothek bedingte Stubbed-Out-Versionen von Funktionen zu definieren. fn_exists foo || foo() { :; }

2 Stimmen

Sie können den Grep speichern, indem Sie type -t y == .

0 Stimmen

Funktioniert nicht, wenn das Gebietsschema nicht Englisch ist. type test_function sagt test_function on funktio. bei Verwendung des finnischen Gebietsschemas und ist eine Funktion wenn Sie Deutsch verwenden.

3voto

Yunus Punkte 171
fn_exists()
{
   [[ $(type -t $1) == function ]] && return 0
}

Update

isFunc () 
{ 
    [[ $(type -t $1) == function ]]
}

$ isFunc isFunc
$ echo $?
0
$ isFunc dfgjhgljhk
$ echo $?
1
$ isFunc psgrep && echo yay
yay
$

2voto

Ich würde es verbessern:

fn_exists()
{
    type $1 2>/dev/null | grep -q 'is a function'
}

Und verwenden Sie es so:

fn_exists test_function
if [ $? -eq 0 ]; then
    echo 'Function exists!'
else
    echo 'Function does not exist...'
fi

2voto

b1r3k Punkte 723

Besonders gut gefallen hat mir die Lösung von Gregory Joseph

Aber ich habe es ein wenig geändert, um den "hässlichen Trick mit den doppelten Anführungszeichen" zu umgehen:

function is_executable()
{
    typeset TYPE_RESULT="`type -t $1`"

    if [ "$TYPE_RESULT" == 'function' ]; then
        return 0
    else
        return 1
    fi
}

0voto

Noah Spurrier Punkte 478

Es ist möglich, 'type' ohne externe Befehle zu verwenden, aber Sie müssen es zweimal aufrufen, so dass es immer noch etwa doppelt so langsam ist wie die 'declare'-Version:

test_function () {
        ! type -f $1 >/dev/null 2>&1 && type -t $1 >/dev/null 2>&1
}

Außerdem funktioniert dies nicht in POSIX sh, also ist es völlig wertlos, außer als Trivialität!

0voto

k_vishwanath Punkte 1056

Sie können sie auf 4 Arten überprüfen

fn_exists() { type -t $1 >/dev/null && echo 'exists'; }
fn_exists() { declare -F $1 >/dev/null && echo 'exists'; }
fn_exists() { typeset -F $1 >/dev/null && echo 'exists'; }
fn_exists() { compgen -A function $1 >/dev/null && echo 'exists'; }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X