bash可以显示函数的定义吗?


262

有没有办法在bash中查看bash函数的定义?

例如,说我定义了函数 foobar

function foobar {
    echo "I'm foobar"
}

有什么办法可以让以后获取foobar运行的代码?

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

Answers:


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
如果您使用的话,可以在非Linux系统上使用旧的Shelltypeset -f
Emmanuel

还好,它只显示function定义,因此您不必解析是否正是您想要的。
ribamar

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

这基本上从您的set命令中打印出以功能名称foobar()开始并以}结尾的行。


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

foob​​ar是函数名称。


4
问题:最多只能显示第一个“}”,只要定义包含Bash确实允许的“ {...}”嵌套,就不能显示所有内容。
Destiny Architect

1
如果函数包含带有花括号模式的here-doc / here-string,也可能会失败
Cheetah
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.