Чи може bash показати визначення функції?


262

Чи є спосіб переглянути визначення функції bash в bash?

Наприклад, скажіть, я визначив функцію foobar

function foobar {
    echo "I'm foobar"
}

Чи є пізніше отримати код, який foobarпрацює?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

Відповіді:


357

Використовуйте type. Якщо foobar, наприклад, визначено у вашому ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

Це дійсно з'ясовує, що foobarбуло, і якщо воно було визначене як функція, воно викликає, declare -fяк пояснило pmohandras.

Щоб роздрукувати лише тіло функції (тобто код), використовуйте sed:

type foobar | sed '1,3d;$d'

2
@sjsupersumit Питання прямо задає рішення Bash.
bfontaine

210

Ви можете відобразити визначення функції в bash за допомогою оголошення. Наприклад:

declare -f foobar

1
Чудово, до речі, працює навіть тоді, коли функції, визначені в інших завантажених файлах сценаріїв. Працює також в zsh.
Дієго Немо

2
Працює зі старими оболонками на нелінукс-системах, якщо ви використовуєтеtypeset -f
Еммануель

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

5
set | sed -n '/^foobar ()/,/^}/p'

Це в основному друкує рядки з набору команд, починаючи з імені функції foobar () і закінчуючи на}


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

при цьому foobar є назвою функції.


4
Проблема: відображатиметься лише до першого "}", що не є все, коли визначення містить вставки "{...}", що дійсно дозволяє Bash.
Архітектор долі

1
Також може вийти з ладу, якщо функція містить сюди-doc / here-string, що містить візерунок фігурних дужок
Гепард,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.