Может ли bash показать определение функции?

262

Есть ли способ просмотреть определение функции bash в bash?

Например, скажем, я определил функцию foobar

function foobar {
    echo "I'm foobar"
}

Есть ли способ позже получить код, который foobarработает?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
K107
источник

Ответы:

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
pmohandas
источник
1
Замечательно, работает даже тогда, когда функции определены в других загруженных файлах скриптов. Работает также в зш.
Диего Немо,
2
Работает со старыми оболочками в не Linux системах, если вы используетеtypeset -f
Эммануэль
Хорошо также, что это просто показывает functionопределение, так что вам не нужно анализировать, если это то, что вы хотите.
Рибамар
5
set | sed -n '/^foobar ()/,/^}/p'

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

Юрген ван дер Марк
источник
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

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

pyroscope
источник
4
Проблема: будет отображаться только до первого "}", что не все, когда определение содержит вложения "{...}", которые действительно допускает Bash.
Архитектор Судьбы
1
Также может произойти сбой, если функция содержит строку here-doc / here-string, содержащую шаблон фигурных скобок
Гепард