Bash 猛击。在调用堆栈中插入函数调用
我试图为bash脚本创建“某种函数挂钩系统”。主bash脚本已经存在,关键是能够创建某种插件系统,以便让用户使用以下三种方法创建包含自己内容的小bash脚本:Bash 猛击。在调用堆栈中插入函数调用,bash,plugins,hook,callstack,Bash,Plugins,Hook,Callstack,我试图为bash脚本创建“某种函数挂钩系统”。主bash脚本已经存在,关键是能够创建某种插件系统,以便让用户使用以下三种方法创建包含自己内容的小bash脚本: Prehooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之前执行 重写->用户将能够完全重写主脚本的功能,以便使用自定义内容重写它 Posthooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之后立即执行 我已经在使用插件系统来预处理和覆盖函数。主脚本解析小插件脚本,并遵循一些规则和验证(命名
- Prehooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之前执行
- 重写->用户将能够完全重写主脚本的功能,以便使用自定义内容重写它
- Posthooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之后立即执行
{
外观,将其替换为{call_to_prehook
,它工作起来很有魅力。但对于后期挂接,我不能这样做。我不能替换}的最后一个外观
设置类似于call\u to\u posthook}
的内容,因为如果函数有一个返回,它将不工作。那个后钩永远也够不着
现在,我正在努力研究是否有可能在调用堆栈或类似的东西中“注入”函数调用。不确定在bash中,在到达“调用树”之前是否可以检查它
一个小PoC,以便更好地理解:
#!/bin/bash
#Main script
function main() {
magic_function
one
two
}
function one() {
echo "one"
}
function two() {
echo "two"
}
function magic_function() {
echo "this function parses plugins and execute needed stuff to modify functions"
echo "I hope to find some way here to do possible the posthooking"
}
我猜要对函数1执行后挂接,可以对函数2执行预挂接,但这对我来说不是一个有效的想法,因为真实脚本的复杂性,当然,因为这样,最后一个函数就不能进行后挂接
有什么想法吗?谢谢。在调用堆栈中“注入”函数调用或类似的内容。不可能。我重写了整个函数,对它的内容执行sed,并搜索第一个{外观以替换为{call_to_prehook,它就像一个符咒一样工作。根本不是一个好主意
bash
实际上不包含这种需要的内省机制。尝试用sed
解析bash脚本是没有希望的,除非你要求程序员遵循严格的格式风格。与其解析函数,不如使用您只需将one
重命名为original\u one
,然后重新定义one
以执行prehook\u one;original\u one“$@”;posthook_one
。其他语言通常都是这样做的。或者,坚持posthook函数将返回代码作为输入并返回返回代码。然后您可以用return MyPostHook whatever
替换任何return whatever
,尽管我更喜欢@Barmar的想法,但您仍然可以使用使用此机制可以使您的prehook和posthhook改变行为。看看“advice”机制在Emacs Lisp中是如何工作的。
#!/bin/bash
#Plugin done by somebody
function posthook_one() {
echo "stuff to be executed after function one of the main script"
}