Проверьте, существует ли функция, прежде чем запускать ее в оболочке

Я хочу проверить, существует ли функция, прежде чем запускать ее в сценарии оболочки.

Поддерживает ли это оболочка сценария? а как это сделать?


person MOHAMED    schedule 31.07.2013    source источник
comment
См. stackoverflow.com/questions/ 85880 / - но вы упоминаете золу, не уверен, работает ли этот раствор и с золой.   -  person fvu    schedule 31.07.2013


Ответы (3)


Как указано в этом комментарии, это должно сделать это:

type -t function_name

это возвращает function, если это функция.

Контрольная работа

$ type -t f_test
$ 
$ f_test () { echo "hello"; }
$ type -t f_test
function

Обратите внимание, что type предоставляет хорошую информацию:

$ type -t ls
alias
$ type -t echo
builtin
person fedorqui 'SO stop harming'    schedule 31.07.2013
comment
Доступен ли -t в ash? Это не POSIX, поэтому мне интересно, является ли это bash расширением. - person chepner; 31.07.2013
comment
Если честно, не знаю, @chepner. - person fedorqui 'SO stop harming'; 01.08.2013

POSIX не определяет никаких аргументов для встроенного type и оставляет его вывод неопределенным. Ваш лучший выбор, помимо решения для конкретной оболочки, вероятно,

if type foo | grep -i function > /dev/null; then
   # foo is a function
fi
person Jens    schedule 31.07.2013

Вы всегда можете просто попробовать выполнить функцию. Если он не существует, статус выхода команды будет 127:

$ myfunction arg1 arg2 || {
>  if [ $? -ne 127 ]; then
>    echo Error with my function
>  else
>    echo myfunction undefined
>  fi; }

Конечно, функция может иметь то же имя, что и другой двоичный файл, и вы можете не захотеть запускать эту программу, если она не затенена функцией.

person chepner    schedule 31.07.2013
comment
Что, если функция деструктивна (подумайте make clean)? Что, если сама функция вернет 127 или ее последняя команда? Я бы не хотел запускать функцию перезагрузки, чтобы посмотреть, существует ли она ... - person Jens; 02.08.2013
comment
Первый пункт верен. Я бы сказал, что если сама функция возвращает 127, это ошибка в функции, поскольку она определена в POSIX как означающая, что команда не найдена. Я работал с предположением, что если он собирается назвать это, если оно существует, нет ничего плохого в том, чтобы просто попытаться позвонить первым. - person chepner; 02.08.2013