Определите, существует ли функция в ударе

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

171
задан codeforester 6 March 2019 в 20:08
поделиться

6 ответов

Я думаю, что Вы ищете команду 'типа'. Это скажет Вам, является ли что-то функцией, встроенной функцией, внешней командой, или просто не определенное. Пример:

$ LC_ALL=C type foo
bash: type: foo: not found

$ LC_ALL=C type ls
ls is aliased to `ls --color=auto'

$ which type

$ LC_ALL=C type type
type is a shell builtin

$ LC_ALL=C type -t rvm
function

$ if [ -n "$(LC_ALL=C type -t rvm)" ] && [ "$(LC_ALL=C type -t rvm)" = function ]; then echo rvm is a function; else echo rvm is NOT a function; fi
rvm is a function
181
ответ дан gaRex 23 November 2019 в 20:43
поделиться
$ g() { return; }
$ declare -f g > /dev/null; echo $?
0
$ declare -f j > /dev/null; echo $?
1
72
ответ дан Eliran Malka 23 November 2019 в 20:43
поделиться

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

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
1
ответ дан 23 November 2019 в 20:43
поделиться

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

fn_exists()
{
  type $1 >/dev/null 2>&1;
}
2
ответ дан 23 November 2019 в 20:43
поделиться

Выкапываю старый пост... но я недавно использовал это и протестировал обе альтернативы, описанные с :

test_declare () {
    a () { echo 'a' ;}

    declare -f a > /dev/null
}

test_type () {
    a () { echo 'a' ;}
    type a | grep -q 'is a function'
}

echo 'declare'
time for i in $(seq 1 1000); do test_declare; done
echo 'type'
time for i in $(seq 1 100); do test_type; done

this generated :

real    0m0.064s
user    0m0.040s
sys     0m0.020s
type

real    0m2.769s
user    0m1.620s
sys     0m1.130s

declare - это намного быстрее!

9
ответ дан 23 November 2019 в 20:43
поделиться

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

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

К тому же это не работает в POSIX sh, поэтому совершенно бесполезно, если не считать пустяков!

0
ответ дан 23 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: