software-design-2021-hse

CLI:

Документация

Документация находится по ссылке.

Тестирование и запуск

  1. Выкачать нужную ветку репозитория:

    git clone --single-branch --branch hw_04 https://github.com/Soykaa/software-design-2022-hse

  2. Зайти в папку: software-design-2022-hse

  3. Для запуска тестов ввести команду: ./gradlew test

    Если вывелась надпись BUILD SUCCESSFUL, значит все тесты прошли, иначе выведется название упавшего теста

  4. Для запуска приложения ввести следующие команды:

    ./gradlew assemble

    java -jar build/libs/*.jar

Поддерживаемые команды:

echo [arguments] - принимает на вход список аргументов, выводит их через пробел. В случае, если аргументы не переданы, выводит пустую строку

pwd - выводит абсолютный путь до текущей рабочей директории, не принимает аргументы

wc [file_name] - в случае, если параметр передан, выводит количество строк, слов и байт в файле с названием file_name, иначе выводит количество строк, слов и байт в стандартном вводе

cat [file_name] - в случае, если параметр передан, выводит содержимое файла file_name, иначе выводит содержимое стандартного ввода

<variable_name>=<value> - присваивает переменной variable_name значение value. В случае, если во вводе пользователя встречается несколько символов '=', разделение происходит по пепрвому из них

<outer_command> [arguments] - вызывает внешнюю команду с названием outer_command и аргументами arguments, если они переданы

$<variable_name> используется для выполнения подстановки значения переменной variable_name. В случае, если значение переменной с таким именем не было определено ранее, то будет выведено сообщение об ошибке.

В случае, если имя переменной не введено, то есть после $ следует один из символов ', ", ' ', |, то подстановка выполнена не будет, символ $ останется в токене

Подстановка не будет выполнена в случае, если $<variable_name> находится внутри одинарных кавычек. Если же $<variable_name> внутри двойных кавычек, то подстановка выполняется

grep <regular_expression> [file_name] - выводит строчки файла file_name, в которых был найден паттерн regular_expression. В случае, если файл не задан, то паттерн ищется в строчках стандартного ввода.

Поддерживается использование команды с флагами:

  • grep -i <regular_expression> [file_name] - регистронезависимый поиск

  • grep -w <regular_expression> [file_name] - поиск только слова целиком

  • grep -A <count> <regular_expression> [file_name] - число count обязательно должно следовать за флагом -A, оно показывает сколько строк после совпадения надо распечатать

exit - завершает работу приложения

Детали реализации команды grep:

  1. Для поиска совпадений используется class Pattern (ссылка, по которой, в том числе, можно посмотреть примеры регулярных выражений).
  2. Для разбора аргументов, передаваемых команде, используется библиотека Apache Commons CLI, выбор в ее пользу был сделан из-за того, что с данной библиотекой мы уже знакомы и работали в другом проекте. Другие рассматриваемые библиотеки:
    1. JCommander - тоже хорошая библиотека для парсинга аргументов командной строки, но опыта работы с ней у нас не было
    2. JSAP: the Java Simple Argument Parser - недостаточно примеров использования, чтобы понять как работать с библиотекой
    3. JOpt Simple - недостаточно документации, не понятно как использовать

Работа с пайпами:

На вход приложению может быть передано несколько команд, разделенных символом |, при этом вывод команды передается на вход следующей, если такая имеется. Пример: echo 123 | wc - команда wc будет работать с тем, что вывела команда echo 123

Пайпы всегда должны разделять команды (пример некорректного ввода: echo 123 | | wc), ввод не может начинаться с символа пайпа или заканчиваться им.

Если в последовательности пайпов встретилась команда exit, то приложение завершает свою работу.