Skip to content

borisPristupa/bash

Repository files navigation

Bash

Запуск

Из директории репозитория: ./run.sh

Общая схема

  1. Запускается Shell, он же REPL, он же while(true)
    1. Cli запрашивает у пользователя следующую строчку
    2. Interpreter преобразует ввод в Executable
    3. Shell выполняет полученный Executable, по итогам чего может:
      1. завершиться благополучно (была установлена переменная окружения $EXIT)
      2. завершиться неблагополучно на любом непредвиденном исключении
      3. продолжить цикл, сохранив код возврата предыдущей команды в $?
  2. Shell завершается с помощью System.exit(code)

Как устроено окружение

Интерфейс Environment, имеющий единственную реализацию -- SystemDelegatingDictEnvironment, которая хранит словарик, а если чего-то в нём не находит, то лезет во внешнее окружение

Что такое Cli

Используемая только в Shell штуковина, позволяющая:

  1. Запросить следующую строчку ввода (в единственной на данный момент существующей реализации перед этим ещё выводится приглашение)
  2. Напечатать что-то в stdout
  3. Напечатать что-то в stdin

Как работает Interpreter

Преобразование строчки в Executable происходит в три этапа:

  1. Лексический анализ в объекте Lexer
  2. Замена переменных окружения в классе DollarVarProcessor
  3. Синтаксический анализ в классе Parser

Что такое Executable

Что угодно, что может запуститься, поработать с потоками ввода/вывода/ошибок и Environment, после чего выдать код возврата. Иерархия такая:

  • Command (какая-то команда, которая имеет имя и может получить аргументы)
    • Builtin (такого класса нет)
      • Cat
      • Echo
      • Pwd
      • Wc
      • Exit
    • ProgramCall (то, что не удалось найти в builtin, попытается быть вызваным в новом процессе)
  • VarAssignment (присвоение значений каким-то переменным окружения)
  • Pipeline (реализован так, что команды по возможности исполняются параллельно)

Для интерфейса Command есть вспомогательный интерфейс CommandBuilder, который позволяет для определённого класса команды создать её экземпляр с конкретными аргументами. Благодаря этому Parser может создать готовые экземпляры команд. Чтобы он мог понять, является ли выстраиваемая команда встроенной или нет, существует интерфейс Builtins, предоставляющий единственный метод -- findBuiltin(String) : Command.Builder.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published