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

jus*_*ody 10 shell posix

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

f()  { echo original; }
f()  { echo wrapper; ...; }
f
Run Code Online (Sandbox Code Playgroud)

这个输出应该是:

wrapper
original
Run Code Online (Sandbox Code Playgroud)

这可能是半便携式的吗?

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

所以,假设我的程序包括

f
g
h
Run Code Online (Sandbox Code Playgroud)

其中f,g,h都是外壳的功能,我想追踪的只是执行g.

Jen*_*ens 7

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

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


ani*_*ane 5

詹斯的答案是正确的。只需添加以下代码即可保证完整性。

您可以简单地按如下方式使用它:

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

f(){
    echo wrapper
    _f # pass "$@" to it if required.
}
Run Code Online (Sandbox Code Playgroud)

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

  • +1。我也使用了这种技术[这里](http://askubuntu.com/questions/73262/how-do-i-teach-bash-in-ubuntu-some-curse-words/73282#73282) (2认同)