Определить, существует ли функция в bash - PullRequest
160 голосов
/ 17 сентября 2008

В настоящее время я делаю некоторые модульные тесты, которые выполняются из bash. Модульные тесты инициализируются, выполняются и очищаются в bash-скрипте. Этот скрипт обычно содержит функции init (), execute () и cleanup (). Но они не обязательны. Я хотел бы проверить, определены они или нет.

Раньше я делал это, подбирая и подсеивая источник, но это казалось неправильным. Есть ли более элегантный способ сделать это?

Редактировать: следующий фрагмент работает как шарм:

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

Ответы [ 13 ]

2 голосов
/ 09 октября 2009

Это говорит вам, если оно существует, но не то, что это функция

fn_exists()
{
  type $1 >/dev/null 2>&1;
}
1 голос
/ 09 октября 2009

Я бы улучшил его до:

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

И используйте это так:

fn_exists test_function
if [ $? -eq 0 ]; then
    echo 'Function exists!'
else
    echo 'Function does not exist...'
fi
0 голосов
/ 26 июня 2010

Можно использовать 'type' без каких-либо внешних команд, но вы должны вызывать его дважды, поэтому он все равно работает примерно вдвое медленнее, чем версия 'Declare':

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

Плюс, это не работает в POSIX sh, так что это абсолютно бесполезно, кроме как мелочи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...