Как мне перечислить функции, определенные в моей оболочке?

223

Я могу ввести псевдоним, чтобы показать список всех псевдонимов.

Но для функций все, что я могу сделать, это grep my .bash_profile.

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

Есть ли более удобный способ узнать, какие функции определены в настоящее время?

Дов
источник
Возможный дубликат получения списка имен функций в сценарии оболочки
Аластер Ирвин
2
@AlastairIrvine Спасибо за дублирование номинации; однако, я решил это наоборот. Этот вопрос имеет значительно больше взглядов и голосов, а также более широкий выбор ответов; и принятый ответ на вашем назначенном дубликате явно неясен и, возможно, просто неверен.
tripleee

Ответы:

273

declare -F

Имена и определения функций могут быть перечислены с -fопцией declareвстроенной команды (см. Bash Builtins). -FВариант declare будет список имен функций только (и , возможно , исходный файл и номер строки).

Справочное руководство Bash

Архетипический Павел
источник
1
в GNU bash 4.3.46 (1) -релиз (x86_64-pc-linux-gnu) -F перечисляет имена / -f перечисляет целую функцию
ceph3us
5
Чтобы получить «необязательный» исходный файл / строку #, кажется, что вы должны включить extdebug ( shopt -s extdebug) И указать одно или несколько имен функций для declare -Fкоманды. IOW, declare -Fникак не поставить имена файлов / строка # S , даже если extdebug включен, что не ясно из документации, а также не особенно интуитивным, ИМО.
Рон Берк
Смотрите ответ @ user495470 ниже для лучшего решения.
starbeamrainbowlabs
82

Предполагая bash shell:

typeset -f

перечислю функции.

typeset -F

будет перечислять только имена функций.

Рэндалл Бон
источник
8
Мой bash v4.1.17 (9) -релиз говорит:Obsolete. See `help declare'.
kevinarpe
5
Еще приятно знать, что это синоним.
bmacnaughton
62
declare -F

даст вам имена всех функций

type function_name

даст вам источник для конкретной функции

Джон Лоуренс Аспден
источник
2
Или просто используйте в качестве источника -f (строчные буквы)
Katastic Voyage
52

declare -F фактически печатает объявления команд, а не только имена функций:

$ declare -F
declare -f function1
declare -f function2

Вы можете использовать compgen -A functionдля печати только имена функций:

$ compgen -A function
function1
function2
LRI
источник
6
compgen -A functionбыло именно то, что я искал.
2
Ницца! В моем случае я также хотел использовать псевдонимы ... вы можете получить как псевдонимы, так и функции с помощьюcompgen -a -A function
Matt Byrne
+1, и я использовал следующее для вывода только моих личных функций (в Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Дмитрий Дзюбак
30

typeset устарел, пожалуйста, используйте:

declare -f

или

declare -f function_name

или

type function_name
Роберт
источник
4
set | grep " ()"

Вместо grep вы также можете использовать fgrep или hgrep (hgrep - мой личный фаворит, это grep, но он высоко оценивает результат «grep-ped»).

hgrep можно найти здесь: ACME Labs hgrep

AtomicKobold
источник
1
Это перечислит функции, но также и переменные, которые имеют значение `()`
Алоис Махдал
2
@AloisMahdal Вот один , который работает: set | grep " () $" | cut -d' ' -f1. Но это слишком сложно по сравнению с другими ответами.
wjandrea
5
grepне является хорошим решением для этого, строки, которые соответствуют определениям функций, вызовут ложные срабатывания. @wjandrea все еще может быть пойман многострочными строками, как и любое регулярное выражение.
Мэтт
1

Я не эксперт в этом, все еще учусь, но после того, как я нашел этот вопрос и ответ на него, потому что я хотел того же, я написал следующее (основываясь на ответе «Архетипов Павел объявляет »), чтобы в конечном итоге дать мне то, чего я добился: отформатированный список псевдонимов и функций:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

Это было , прежде чем я увидел ответ LRI в , и так экстраполируя , что я заменить declareи aliasстроку с соответствующими compgenкомандами вместо того , чтобы получить:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

Woks угощение за то, что я хотел. Обмен в случае, если это помогает кому-либо еще.

Есть множество других «действий», доступных для compgen -A [action](и других вариантов, compgenконечно). Я нашел хорошую статью здесь, которая также содержит ссылку на страницу руководства (потому man compgenчто в некоторых случаях она не работает).

DavidT
источник