Может ли 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.
августа

210

Вы можете отобразить определение функции в bash с помощью команды Declare. Например:

declare -f foobar

1
Замечательно, работает даже тогда, когда функции определены в других загруженных файлах скриптов. Работает также в зш.
Диего Немо,

2
Работает со старыми оболочками в не Linux системах, если вы используетеtypeset -f
Эммануэль

Хорошо также, что это просто показывает functionопределение, так что вам не нужно анализировать, если это то, что вы хотите.
Рибамар

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

Это в основном печатает строки из вашей команды set, начиная с имени функции foobar () и заканчивая}


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

с foobar, являющимся именем функции.


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

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