【发布时间】:2011-10-18 12:19:33
【问题描述】:
有没有办法在 bash 中查看 bash 函数的定义?
例如,假设我定义了函数foobar
function foobar {
echo "I'm foobar"
}
以后有什么办法可以得到foobar运行的代码吗?
$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
【问题讨论】:
有没有办法在 bash 中查看 bash 函数的定义?
例如,假设我定义了函数foobar
function foobar {
echo "I'm foobar"
}
以后有什么办法可以得到foobar运行的代码吗?
$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
【问题讨论】:
使用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'
【讨论】:
type 也会扩展别名,这是一个不错的奖励:)
set | sed -n '/^foobar ()/,/^}/p'
这基本上打印了 set 命令中以函数名 foobar () 开头并以 } 结尾的行
【讨论】:
set 输出a) cmets 被剥离,b) 函数名和parens 之间的空白区域标准化。我仍然不愿意使用它,因为可能存在包含 } 的变量,这可能会使简单解析失败。
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'
foobar 是函数名。
【讨论】:
您可以使用 declare 显示 bash 中函数的定义。例如:
declare -f foobar
【讨论】:
typeset -f,则可以在非Linux系统上与旧shell一起使用
function 定义,因此您不必解析是否是您想要的。
zsh。