Дано: код пишется частично на bash, частично на python. «Запускающую» роль имеет питон, ибо рулить им слегка проще.
Получается этакий «питон со вставками на bash». Bash там нужен в основном затем, чтобы прямо в терминале наблюдать красивый вывод из гнушных системных утилит (н-р internal compiler error в GCC - достаточно важная штука, чтобы его выхлоп можно было посмотреть сразу и красиво:).
Сейчас это как-то работает, но скверно, недобро, это даже не фигота, а нездоровая китайская эриоботрия.
(Аналогичная ситуация есть для си и крестов, «си с башевыми вставками», но пока не стоит остро, предложения по прерывания c/c++ тоже было бы интересно. C++ с классами и шаблонами, C «чистый от скверны» - т.е. сам си, без автосгенеренного кода).
(среда, если это важно: стандартная ситуация для Linux/MacOSX: обязательное наличие GNU bash 3.2.51+, perl 5.12+, python 3.4+, и основных утилит GNU (желательно, без злоупотреблений, н-р на системе со старым getopt (MacOSX) не кошерно просить новый getopt (Linux), но в общем можно потребовать любые популярные утилиты, даже новый getopt))
Допустим, у нас алгоритм записан так: Питон->Баш->Баш->Питон. Нужно реализовать эту цепочку.
1) нужно прервать выполнение питон-скрипта, собрать важные переменные-контекст и выплюнуть все это в баш. С прерыванием непосредственно питоновского скрипта, т.е. очень желательно, чтобы новый баш не был чайлдом, а был сиблингом с точки зрения запускающего шелла. Как это сделать правильно? («Ты дебил»/«не гуглил» итэпэ - черт возьми, сделать это можно тысячью способов, вопрос в том, какой из них расово верный для линукса).
2) Теперь, башевый скрипт закончился и мы хотим вернуться назад в питон и восстановить состояние до той точки, откуда начинали. Тут возинкают два вопроса: а) методика сохранения состояния между перезапусками, которая позволяла бы писать как можно меньше boilerblate на сохранение состояния и б) методика грубо говоря осуществления goto, поиска нужной точки кода, где сохраненное состояние имеет смысл. Мы не можем сделать goto на произвольную часть кода, соответственно его нужно как-то специальным образом организовать.
Ну и раз уж здесь ЛОР, то
3) Как мне сделать то что я хочу, а не то, что я попросил? :3
Идея не рекурсивного запуска, а замены сиблингом - ногами из эпохи печатных терминалов. Т.е. мы имеем некую бумагу, в которой пробиваем дырки, мы не можем рекурсивно вызвать из бумаги бумагу.
Идея прерывания с адресом возврата ногами еще из ассемблера, когда мы кладем адрес возврата и прыгаем в сабрутину. Сабрутина может быть на чем угодно написана, лишь бы адрес возврата никуда не девался. Но в асме у нас как бы есть физическое «общее состояние», а запуская из питона баш каково общее состояние? Переменные окружения? Файл? Да и вообще, как-то довольно убого писать в «плоском» стиле на питоне. Из кода получится не лапша, а даже что-то хуже, т.к. количество уровней вложенности строго ограничено кодом обработки «файлов»-«регистров».
Может быть все это давным-давно устарело, и его небоходимо выбросить на свалку. С другой стороны, представляете, как это няшно: когда можно работать в голом терминале, н-р сидя на одном-единственном коннекте до целевого сервака в путти или айтерме, и все работает. Разве оно не стоит того?