Bash. Вставить вызов функции в стек вызовов - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь создать "какую-то систему перехвата функций" для скрипта bash. Основной сценарий bash уже существует, и смысл в том, чтобы иметь возможность создать какую-то систему плагинов, чтобы позволить пользователям создавать небольшие сценарии bash, содержащие свои собственные вещи, с помощью следующих трех методов:

  • Prehooking-> пользователи смогут создавать функцию, которая будет выполняться до функции основного скрипта, которую они выбирают
  • Переопределение -> пользователи смогут полностью переопределить функцию основного скрипта, чтобы переписатьс пользовательским содержимым
  • Posthooking -> пользователи смогут создавать функцию, которая будет выполняться сразу после функции основного сценария, которую они выбирают

Я уже работаю сСистема плагинов для предварительного подключения и переопределения функций. Основной скрипт анализирует маленькие скрипты плагинов и следит за некоторыми правилами и проверками (номенклатура и т. Д.), Если плагин хорошо работает, он работает.

Моя проблема заключается в попытке создать функцию posthooking, и я ищудля идей. Причина в том, что для предварительного подключения я переписываю всю функцию, выполняя sed над ее содержимым и ища первый внешний вид {, который должен быть заменен на { call_to_prehook, и он работает как шарм. Но я не могу сделать то же самое для posthooking. Я не могу заменить последнее появление }, чтобы установить что-то вроде call_to_posthook }, потому что если функция имеет возврат, она не будет работать. Этот 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"
}

#!/bin/bash
#Plugin done by somebody

function posthook_one() {
    echo "stuff to be executed after function one of the main script"
}

Я думаю, что для выполненияпосле подключения функции один это можно сделать, выполнив предварительную функцию второй функции, но для меня это недопустимая идея из-за сложности реального сценария и, конечно, потому что таким образом последняя функция не может быть запущена.

Есть идеи? Спасибо.

...