覆盖shell函数,保留对原始函数的引用

时间:2013-05-27 13:41:41

标签: shell posix

是否可以覆盖shell函数并保留对原始函数的引用?

f()  { echo original; }
f()  { echo wrapper; ...; }
f

这个的输出应该是:

wrapper
original

这是否可以半便携式方式实现?

基本原理:我正在尝试通过用shell函数替换部分函数来测试我的程序,这些函数将其调用记录到日志文件中。只要我只包装命令和内置函数,并且只要我不介意不加选择的日志记录,这样就可以正常工作。现在,我想通过在每次测试中记录有趣的部分来使测试套件更易于维护。

所以让我们说我的程序包含

f
g
h

其中fgh都是shell函数,我想跟踪g的执行情况。

2 个答案:

答案 0 :(得分:4)

Jens的回答是正确的。只需添加以下代码即可完成。

您可以按以下方式使用它:

eval "`declare -f f | sed '1s/.*/_&/'`" #backup old f to _f

f(){
    echo wrapper
    _f # pass "$@" to it if required.
}

我在这里使用了相同的逻辑:https://stackoverflow.com/a/15758880/793796

答案 1 :(得分:3)

许多shell(至少zsh,ksh,bash)支持typeset -f f转储f()的内容。 使用此选项将当前定义保存到文件中;然后,根据需要定义f()。通过获取使用typeset创建的文件来恢复f()。

如果你稍微修改了转储函数(在第一行重命名f()_f();当f()递归或者用同样的方式调用其他函数时有点棘手),你可能会得到这个产生你想要的输出。