Kbool 0.1.0: классы и модули в духе Free Pascal для: на практике
PrimeCoder · 2026 · формат. news
Что произошло, почему это важно и что взять в работу.
Даёт способ превратить разросшиеся bash-скрипты в поддерживаемый код с классами и модулями там, где Python недоступен, это снижает стоимость владения legacy-автоматизацией в CI и на серверах.
Связанные услуги: Лендинг под ключ, AI Boost Team, стать клиентом.
Скрипт, который вырос в проблему
Bash-скрипт начинается с двадцати строк. Через пару лет в нём две тысячи, три десятка функций, глобальные переменные с префиксами, чтобы они не столкнулись, и source с $(dirname "$0") в начале каждого файла. Функция "возвращает" значение через stdout, поэтому каждый вызов обёрнут в $( ), а каждая такая подстановка это fork, а fork стоит денег на горячем пути.
Переписать всё на Python можно не всегда. Скрипт живёт там, где гарантированно есть только bash и базовые утилиты, или его поддерживают люди, которые пишут на bash. Вторая половина проблемы переносимость. sed -i, stat -c, date -d, grep -Z, \b в регулярке, nc -l ведут себя по-разному на Ubuntu, на Alpine с busybox, на FreeBSD, на macOS и в Git-bash на Windows. Скрипт, который год работал на одной машине, ломается на соседней.
Keksov выпустил kbool 0.1.0, надстройку над bash, которая приносит в него привычки Free Pascal. Модули подключаются по имени через uses, классы объявляются как class … end с наследованием и inherited, а библиотека kcl даёт знакомые имена вроде TStringList, TDictionary, TIniFile, TRegEx. Репозиторий открыт под MIT, требуется bash 5.1 или новее.
Что внутри
Проект это пять git-репозиториев, корневой и четыре подмодуля. kkore несёт системные модули, загрузчик kk.uses, конфигурацию и обработчик ошибок. kklass отвечает за классы, поля, свойства с геттерами и сеттерами, конструкторы и деструкторы, наследование с inherited, статические члены и секции видимости. kcl это библиотека из 29 модулей, порты классов FPC и Delphi (TList, TStringList, TDictionary, TIniFile, TPath, TRegEx, DateUtils, Math), обёртки над grep, sed, awk, find, head, tail и небольшой HTTP-сервер. ktests даёт тестовый фреймворк и "гейт", одну команду, которая гоняет все наборы тестов.
Версия bash проверяется первым делом. POSIX sh и старые bash не поддерживаются, kbool.sh отказывается работать с кодом выхода 2 и одной строкой в stderr, а не падает на середине загрузки. Это мелочь, но она экономит часы отладки на чужих конвейерах.
Классы, которые не прячут bash
Класс объявляется в стиле паскалевского interface. Сначала структура, потом тела методов как обычные функции bash, потом build. Тела методов остаются настоящими функциями, редактор их подсвечивает, кавычки внутри строк экранировать не нужно. Внутри тела поля это обычные переменные, а func отдаёт значение в $RESULT и печатает его только внутри $( ).
У всех модулей kcl один контракт. значение возвращается в RESULT, а не в stdout; код возврата 0, успех, 1, "нет" или "не найдено" (молча, без сообщений), 2, неправильный вызов.
Почему так, видно в стоимости fork. Подстановка $( ) порождает процесс, а на горячем пути это налог, который рано или поздно съедает выигрыш от "простого bash". Единый контракт модулей решает вторую боль, когда у каждой функции свой способ вернуть значение и свой смысл кода возврата.
Наследование выглядит так, как ожидает человек, писавший на Delphi. Все методы виртуальные, override это проверка при сборке, что у предка такой метод есть. Не магия, а дисциплина поверх уже знакомого языка.
Переносимость как тест, а не как надежда
Ключевая часть не синтаксис, а CI. 13 конфигураций прогоняются на каждый push в main и на каждый pull request, Linux с glibc и musl, macOS, FreeBSD, Windows через Git-bash и MSYS2. Тесты фиксируют различия mawk, gawk, busybox awk, особенности bash 5.1 вроде declare -f и unset с ключом @, а также проблему десятичной запятой в локалях ru_RU и de_DE.
Это то, чего обычно нет в bash-проектах. Переносимость проверяется "на боевом сервере", когда скрипт уже упал в пятницу. Здесь же она превращена в гейт, и релиз не выходит, пока не пройдёт.
Демо, которое честно о себе
В examples/notes.sh лежит HTTP-сервис заметок, около 175 строк кода без комментариев и пустых строк. Он показывает три модуля библиотеки и одну идею, обработчики запросов выполняются в том же процессе bash, что и сервер, поэтому объекты живут между запросами. Заметки хранятся в INI-файле через TMemIniFile и переживают перезапуск, поиск ищет слово целиком, без учёта регистра, через TRegEx и \b.
Ограничения сервера честно записаны в README, один запрос за раз, без keep-alive, около 10 запросов в секунду последовательно, без аутентификации. Это не конкурент nginx, это демон того, что классы и модули держат нагрузку уровня внутреннего инструмента.
Отдельная честность про TRegEx. Он работает на POSIX ERE из bash, а не на PCRE, поэтому ленивых квантификаторов и lookaround нет. Отклонения от FPC перечислены для каждого модуля в его README. Покупаете файл, а не волшебную кнопку, но файл честный.
Кому это нужно и когда нет
Kbool имеет смысл там, где bash уже фактически закреплён, а скрипт перешёл порог в сотни строк с общими переменными и копипастой. CI-шаги, обвязка деплоя, обслуживание серверов без гарантии Python, legacy-автоматизация, которую страшно трогать. Классы и модули снижают стоимость владения таким кодом, а единый контракт и CI переносимости убирают класс "упало только на Alpine".
Не нужно там, где pipe и одноразовый скрипт справляются, где команда не знает паскалевских привычек, или где требуется POSIX sh. Bash 5.1 это жёсткий порог, а не рекомендация.
Релиз 0.1.0, проект разработан с помощью ИИ, и в статье есть отдельный раздел про то, кто что решал, как проверялся код и какие у этого цифры. Пока это ранняя версия, и надёжность проверяется временем и вашими тестами, а не номером в заголовке.
Цена ошибки здесь прежняя, скрипт, который работал на одной машине, ломается на соседней, только теперь у вас есть инструмент, чтобы это не случилось.
Артём Волков, репортёр.
PrimeCoder Team · Официальный ответ · PrimeCoder
Укажите объём тикетов в неделю и долю повторных обращений — прикинем, что измерять в первом пилоте.
Зоя · Операционный менеджер
Как вы измеряете долю решённых с первого касания после внедрения сценариев?
Эдуард · Собственник
Сколько стоит «откат» сценария, если рынок или продукт резко меняется?