重写shell函数,保留对原始函数的引用

重写shell函数,保留对原始函数的引用,shell,posix,Shell,Posix,是否可以重写shell函数并保留对原始函数的引用 f() { echo original; } f() { echo wrapper; ...; } f 其输出应为: wrapper original 这是否可能以半便携的方式实现 理由:我正试图用shell函数替换程序的某些部分,将它们的调用记录到日志文件中,以此来测试我的程序。只要我只包装命令和内置代码,只要我不介意不加区分的日志记录,这就可以了。现在,我想通过只记录每个测试中感兴趣的部分来提高测试套件的可维护性 假设我的程序包括 f

是否可以重写shell函数并保留对原始函数的引用

f()  { echo original; }
f()  { echo wrapper; ...; }
f
其输出应为:

wrapper
original
这是否可能以半便携的方式实现

理由:我正试图用shell函数替换程序的某些部分,将它们的调用记录到日志文件中,以此来测试我的程序。只要我只包装命令和内置代码,只要我不介意不加区分的日志记录,这就可以了。现在,我想通过只记录每个测试中感兴趣的部分来提高测试套件的可维护性

假设我的程序包括

f
g
h
其中,
f
g
h
都是shell函数,我只想跟踪
g
,许多shell(至少zsh、ksh、bash)支持
typeset-f
转储
f()的内容。
使用此选项将当前定义保存到文件中;然后,根据需要定义
f()
。通过源化使用
字体创建的文件来还原f()


如果您稍微修改转储函数(在第一行将
f()
重命名为
\u f()
;当f()是递归函数或以相同方式调用其他函数时,会有点麻烦),您可能会得到这样的结果,以生成所需的输出。

Jens的答案是正确的。为了完整性,只需添加下面的代码

您只需按以下方式使用它:

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

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

我在这里使用了同样的逻辑:

无论是
排版还是
声明都不是POSIX(2013年第8期)。@Jens:你是说第7期TC1(2013年版)。第8期尚未发行。:)+1.我也使用了这种技术,你想做什么就做什么,但不是很方便。