Я пытаюсь написать некоторый код в ударе, который использует самоанализ для выбора соответствующей функции для вызова.
Определение кандидатов требует знания, какие функции определяются. Легко перечислить определенные переменные в ударе с помощью только расширение параметра:
$ prefix_foo="one"
$ prefix_bar="two"
$ echo "${!prefix_*}"
prefix_bar prefix_foo
Однако выполнение этого для функций, кажется, требует фильтрации вывода набора - намного более случайный подход.
Существует ли Правильный Путь?
Как насчет compgen :
compgen -A function # compgen is a shell builtin
У меня есть запись в моем .bashrc
, которая гласит:
alias list='declare -F |cut -d" " -f3'
Что позволяет мне набирать список
и получите список функций. Когда я добавил это, я, наверное, понял, что происходит, но я не могу вспомнить, чтобы спасти свою жизнь в данный момент.
Удачи,
- джед
Pure Bash:
saveIFS="$IFS"
IFS=$'\n'
funcs=($(declare -F)) # create an array
IFS="$saveIFS"
funcs=(${funcs[@]##* }) # keep only what's after the last space
Затем запустите в командной строке Bash в качестве примера, отображающего функции завершения bash:
$ for i in ${funcs[@]}; do echo "$i"; done
__ack_filedir
__gvfs_multiple_uris
_a2dismod
. . .
$ echo ${funcs[42]}
_command
Один (уродливый) подход - использовать grep для вывода set:
set \
| egrep '^[^[:space:]]+ [(][)][[:space:]]*$' \
| sed -r -e 's/ [(][)][[:space:]]*$//'
Приветствуются лучшие подходы.
$ declare -F
declare -f ::
declare -f _get_longopts
declare -f _longopts_func
declare -f _onexit
...
Итак, псевдоним Джеда Дэниела,
declare -F | cut -d" " -f3
сокращает пробел и повторяет 3-е поле:
$ declare -F | cut -d" " -f3
::
_get_longopts
_longopts_func
_onexit
Используйте встроенную функцию declare для списка определенных функций:
declare -F
Возможно, мое решение для этой темы подойдет вам. Google для "получить список имен функций в сценарии оболочки site: stackoverflow.com"