Разработчик amatsuda выпустил Rubish — UNIX-шелл, полностью написанный на Ruby. Синтаксис шелла парсится и компилируется в Ruby-код, который потом исполняет Ruby VM. Заявлена полная совместимость с bash: существующие bash-скрипты должны работать без изменений. Если что-то не работает — это считается багом.
Rubish не просто реализован на Ruby, а глубоко интегрирован с ним. Команды можно вызывать как методы с аргументами, использовать цепочки вызовов вместо пайпов (ls().sort.uniq) и передавать в метод Ruby-блок для обработки вывода (ls.each { |f| puts f.upcase }). Любая строка, начинающаяся с заглавной буквы, выполняется как Ruby-код — можно прямо в шелле писать Time.now или Dir.glob('*'). Условия в if, while, until принимают Ruby-выражения в фигурных скобках. Поддержаны лямбды (-> { }), Ruby-массивы (их шелл отличает от glob-паттернов) и Ruby-стиль определения функций через def...end с именованными параметрами.
Кастомизация промпта работает через Ruby-функцию rubish_prompt, которая вызывается перед каждым приглашением. Есть lazy_load для отложенной загрузки медленных инициализаций вроде rbenv init — они запускаются в фоновом потоке, не тормозя старт шелла. Режим rubish -r отключает все интеграции с Ruby (инлайн-код, блоки, условия, массивы) для безопасного запуска непроверенных скриптов — только стандартный shell-синтаксис.
Кроме bash-совместимости, Rubish понимает zsh-фичи: setopt, compdef, compinit, autoload, RPROMPT и сокращённые пути (типа a/c/a → app/controllers/application_controller.rb). Файлы конфигурации загружаются в определённом порядке: профиль для login-шеллов, ~/.rubishrc для интерактивных, project-локальный .rubishrc и logout-скрипт.
Rubish можно встроить в другую Ruby-программу — например, в терминал или плагин к IDE. Для этого есть Rubish::REPL с методами tokenize, try_parse, complete_at, prompt_segments. Можно подменить стандартный фронтенд (Reline + stdin/stdout) на свой, унаследовавшись от Rubish::Frontend::Base. И есть хук child_pre_exec_hook, который выполняется в каждом форкнутом процессе перед exec() — например, чтобы привязать управляющий tty для корректной обработки Ctrl-C.
Релиз доступен на GitHub под лицензией MIT. Установка через Homebrew: brew tap amatsuda/rubish && brew install --HEAD rubish. Также можно клонировать репозиторий и запустить ./bin/rubish.