是否可以覆盖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.
许多 shell(至少 zsh、ksh、bash)支持typeset -f f转储f(). 使用它可以将当前定义保存到文件中;然后,f()根据需要定义。通过获取使用 . 创建的文件来恢复 f() typeset。
如果您稍微修改转储的函数(在第一行重命名f()为_f();当 f() 递归或以相同方式调用其他函数时会有点棘手),您可能会得到它以产生您想要的输出。
詹斯的答案是正确的。只需添加以下代码即可保证完整性。
您可以简单地按如下方式使用它:
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