CLI - Command-line Interface
Класс Shell
реализует интерфейс взаимодействия с пользователем. Считывает введённые с клавиатуры команды и выводит результат их работы на экран.
Класс так же передаёт сырые входные данные парсеру, а затем принимает решения о вызове необходимых пользователю функций.
Класс Parser
с помощью детерминированного конечного автомата разбирает входную последовательность символов, составляя из неё команду, которую необходимо выполнить, и список агрументов этой команды.
Автомат имеет 4 состояния — обычное состояние, состояние внутри двойных кавычек, состояние внутри одинарных кавычек, и состояние, в котором ведётся поиск переменной, для которой необходимо выполнить подстановку.
Переходя между состояниями мы собираем по одному символу название команды — и её аргументы.
Так же в процессе разбора входной строки происходит подстановка ($variable) и определение, является ли входная строка операцией присваивания.
Класс Environment
хранит в себе переменные среды (сохранённые туда в течение этого запуска консоли),
а так же предоставляет к ним доступ для других функций.
Класс RawCommandData
хранит имя консольной команды и список её аргументов.
Интерфейс Сommand
представляет основу для создания консольных команд для этого CLI и определяет сигнатуру метода запуска операций.
Каждая из операций принимает на вход входной поток, из которого может взять дополнительные данные для своего выполнения.
Так же каждая операция записывает свои результаты в выходной поток и возвращает его, как результат своей работы.
Операция присваивания (вида x=10). Имя переменной операция берёт из первого аргумента. Значение переменной из второго своего аргумента. Операция записывает переменную с полученными именем и значением, как переменную среды CLI.
Операция читает данные и выводит их назад в выходной поток.
Если первый аргумент присутствует — то операция пытается найти файл с таким именем и прочитать его.
Если же аргументов нет — то Сat
читает данные из входного потока и выводит их в выходной поток.
Данная операция выводит в выходной поток список всех своих аргументов, соединённых пробелом.
Данная операция передаёт сигнал Shell
, чтобы она завершила выполнение операций после выполнения операции Exit
.
После этого Shell
не ждёт никакого ввода от пользователя и завершается.
В случае, если Shell
не находит операции, которую запросил пользователь, среди списка поддерживаемых — то она пытается вызвать эту операцию, как внешний процесс.
Данный класс обеспечивает связывание потоков Shell
и внешнего процесса.
Данная операция выводит в выходной поток текущую рабочую директорию, её абсолютный путь.
Данная операция определяет количество строк, слов и байт во входной информации.
Если первый аргумент присутствует — то операция пытается найти файл с таким именем, прочитать его и определить необходимое из его содержимого, а затем записать полученную информацию в выходной поток.
Если же аргументов нет — то Wc
читает данные из входного потока и выведет информацию о количестве строк, слов и байт о ней в выходной поток.