Як перерахувати функції, визначені в моїй оболонці?


223

Я можу ввести псевдонім, щоб показати список усіх псевдонімів.

Але що стосується функцій, все, що я можу зробити, - це грепати своє .bash_profile.

Це отримує лише ті, які є у цьому файлі, а не ті, що визначені у допоміжних файлах чи динамічно.

Чи є більш зручний спосіб з'ясувати, які функції на даний момент визначені?



2
@AlastairIrvine Дякую за дублікат номінації; однак я вирішив це навпаки. Це питання має значно більше поглядів та результатів, а також більш широкий вибір відповідей; і прийнята відповідь на ваш номінований дублікат є явно незрозумілою і, мабуть, просто помилковою.
тріплей

Відповіді:


273

declare -F

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

Довідковий посібник Баша


1
в GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F перелічує імена / -f списки всієї функції
ceph3us

5
Щоб отримати "необов'язковий" вихідний файл / рядок #, видається, ви повинні ввімкнути extdebug ( shopt -s extdebug) І подати declare -Fкоманду одне або кілька імен функцій . IOW, declare -Fніяк НЕ поставити імена файлів / рядок # S , навіть якщо extdebug включений, що не ясно з документації, а також не дуже інтуїтивним, ІМО.
Рон Берк

Дивіться відповідь @ user495470 нижче для кращого рішення.
starbeamrainbowlabs

82

Якщо припустити шкаралупу bash:

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

51

declare -F насправді друкує оголошення команд, а не лише імен функцій:

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

Ви можете використовувати compgen -A functionдля друку лише імена функцій:

$ compgen -A function
function1
function2

6
compgen -A functionбуло саме те, що я шукав.

2
Приємно! Я хотіла псевдонімів і в моєму випадку ... ви можете отримати як псевдоніми, так і функції за допомогоюcompgen -a -A function
Метт Бірн

+1, і я використовував наступне, щоб виводити лише мої особисті функції (на Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Дмитро Дзюбак

30

набір застарілих, будь ласка, використовуйте:

declare -f

або

declare -f function_name

або

type function_name

4
set | grep " ()"

Замість grep ви також можете використовувати fgrep або hgrep (hgrep - мій особистий фаворит, це grep, але він привіт освітлює результат "grep-ped".

hgrep можна знайти тут: ACME Labs hgrep


1
Тут буде перераховано функції, але також змінні, які мають значення "()"
Alois Mahdal

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"
}

Це було до того, як я побачив відповідь Лрі , і настільки екстраполюючи це, я замінюю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"
}

Шукає частування за те, що я хотів. Спільний доступ, якщо це допомагає комусь іншому.

Існує безліч інших "дій" compgen -A [action](та інших варіантів, compgenзвичайно). Я знайшов хорошу рецензію тут , який також включає в себе посилання на сторінку людини (тому що man compgenне працює в деяких випадках).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.