Я пытаюсь создать "какую-то систему перехвата функций" для скрипта 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"
}
Я думаю, что для выполненияпосле подключения функции один это можно сделать, выполнив предварительную функцию второй функции, но для меня это недопустимая идея из-за сложности реального сценария и, конечно, потому что таким образом последняя функция не может быть запущена.
Есть идеи? Спасибо.