Determine if a function exists in bash

后端 未结 13 2664
再見小時候
再見小時候 2020-11-30 17:39

Currently I\'m doing some unit tests which are executed from bash. Unit tests are initialized, executed and cleaned up in a bash script. This script usualy contains an init(

13条回答
  •  悲&欢浪女
    2020-11-30 18:11

    Testing different solutions:

    #!/bin/bash
    
    test_declare () {
        declare -f f > /dev/null
    }
    
    test_declare2 () {
        declare -F f > /dev/null
    }
    
    test_type () {
        type -t f | grep -q 'function'
    }
    
    test_type2 () {
         [[ $(type -t f) = function ]]
    }
    
    funcs=(test_declare test_declare2 test_type test_type2)
    
    test () {
        for i in $(seq 1 1000); do $1; done
    }
    
    f () {
    echo 'This is a test function.'
    echo 'This has more than one command.'
    return 0
    }
    post='(f is function)'
    
    for j in 1 2 3; do
    
        for func in ${funcs[@]}; do
            echo $func $post
            time test $func
            echo exit code $?; echo
        done
    
        case $j in
        1)  unset -f f
            post='(f unset)'
            ;;
        2)  f='string'
            post='(f is string)'
            ;;
        esac
    done
    

    outputs e.g.:

    test_declare (f is function)

    real 0m0,055s user 0m0,041s sys 0m0,004s exit code 0

    test_declare2 (f is function)

    real 0m0,042s user 0m0,022s sys 0m0,017s exit code 0

    test_type (f is function)

    real 0m2,200s user 0m1,619s sys 0m1,008s exit code 0

    test_type2 (f is function)

    real 0m0,746s user 0m0,534s sys 0m0,237s exit code 0

    test_declare (f unset)

    real 0m0,040s user 0m0,029s sys 0m0,010s exit code 1

    test_declare2 (f unset)

    real 0m0,038s user 0m0,038s sys 0m0,000s exit code 1

    test_type (f unset)

    real 0m2,438s user 0m1,678s sys 0m1,045s exit code 1

    test_type2 (f unset)

    real 0m0,805s user 0m0,541s sys 0m0,274s exit code 1

    test_declare (f is string)

    real 0m0,043s user 0m0,034s sys 0m0,007s exit code 1

    test_declare2 (f is string)

    real 0m0,039s user 0m0,035s sys 0m0,003s exit code 1

    test_type (f is string)

    real 0m2,394s user 0m1,679s sys 0m1,035s exit code 1

    test_type2 (f is string)

    real 0m0,851s user 0m0,554s sys 0m0,294s exit code 1

    So declare -F f seems to be the best solution.

提交回复
热议问题