是否可以覆盖shell函数并保留对原始函数的引用?
f() { echo original; }
f() { echo wrapper; ...; }
f
这个的输出应该是:
wrapper
original
这是否可以半便携式方式实现?
基本原理:我正在尝试通过用shell函数替换部分函数来测试我的程序,这些函数将其调用记录到日志文件中。只要我只包装命令和内置函数,并且只要我不介意不加选择的日志记录,这样就可以正常工作。现在,我想通过在每次测试中记录有趣的部分来使测试套件更易于维护。
所以让我们说我的程序包含
f
g
h
其中f
,g
,h
都是shell函数,我想跟踪g
的执行情况。
答案 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()递归或者用同样的方式调用其他函数时有点棘手),你可能会得到这个产生你想要的输出。