Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 猛击。在调用堆栈中插入函数调用_Bash_Plugins_Hook_Callstack - Fatal编程技术网

Bash 猛击。在调用堆栈中插入函数调用

Bash 猛击。在调用堆栈中插入函数调用,bash,plugins,hook,callstack,Bash,Plugins,Hook,Callstack,我试图为bash脚本创建“某种函数挂钩系统”。主bash脚本已经存在,关键是能够创建某种插件系统,以便让用户使用以下三种方法创建包含自己内容的小bash脚本: Prehooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之前执行 重写->用户将能够完全重写主脚本的功能,以便使用自定义内容重写它 Posthooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之后立即执行 我已经在使用插件系统来预处理和覆盖函数。主脚本解析小插件脚本,并遵循一些规则和验证(命名

我试图为bash脚本创建“某种函数挂钩系统”。主bash脚本已经存在,关键是能够创建某种插件系统,以便让用户使用以下三种方法创建包含自己内容的小bash脚本:

  • Prehooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之前执行
  • 重写->用户将能够完全重写主脚本的功能,以便使用自定义内容重写它
  • Posthooking->用户将能够创建一个函数,该函数将在他们选择的主脚本函数之后立即执行
我已经在使用插件系统来预处理和覆盖函数。主脚本解析小插件脚本,并遵循一些规则和验证(命名法等)。如果插件做得很好,它就会工作

我的问题是试图创建后挂接功能,我正在寻找想法。原因是,为了进行预选,我重写了整个函数,对其内容进行sed,并搜索第一个
{
外观,将其替换为
{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"
}