Задание по практикуму на осенний семестр для 215 и 216 групп (2005)

См. оригинал здесь.

Предлагается реализовать интерактивный командный интерпретатор, осуществляющий в цикле считывание командной строки со стандартного ввода, анализ и исполнение соответствующих действий.

Задание выполняется в несколько этапов.

  1. Написать программу, выполняющую в цикле чтение строк со стандартного ввода и разделяющую строки на отдельные слова. Любое количество идущих подряд пробельных символов обрабатывается так же, как один пробел. Текст, заключенный в двойные кавычки, рассматривается как одно слово или часть слова, т.е. внутри двойных кавычек пробельные символы рассматриваются как обычные символы. Например:

       > aaa «bbb ccc» ddd
       aaa
       bbb ccc
       ddd
    

    > aaaa «bbb»ccc«ddd» eee aaaa bbbcccddd eee

    Допускаются строки произвольной длины, т.е. программа должна вести себя корректно вне зависимости от того, какой длины строка подана на ввод (!). Программа завершает работу в ситуации «конец файла» на стандартном вводе. Обработка конца файла должна быть реализована корректно.

    Требование к коду: в программе после считывания очередной строки должен быть сформирован список полученных слов, и только после этого слова должны выводиться на экран, чтобы продемонстрировать корректную работу.

  2. Вызов внешних команд. Модифицировать программу таким образом, чтобы она воспринимала первое полученное слово как имя команды, остальные — как параметры команды и осуществляла исполнение введенных команд (программ, находящихся на диске в директориях, перечисленных в переменной PATH, или указанных по полному имени). Дополнить программу встроенной командой cd для смены текущего каталога.

  3. Модифицировать подпрограмму чтения (1-ый этап) таким образом, чтобы она воспринимала символ «&» (если он встречен вне кавычек) как разделительный символ (т.е. символ, который является отдельным словом сам по себе). Реализовать выполнение команд в фоновом режиме. Запускать в фоновом режиме команды, последним словом в котором является символ «&». Если символ «&» встречен не в конце, выдавать сообщение об ошибке. По завершении команды, выполнявшейся в фоновом режиме, выдавать сообщение о ее завершении и код завершения.

  4. Модифицировать подпрограмму чтения таким образом, чтобы символы «|» и, в зависимости от варианта, символ «<», «>» или «>>» воспринимались как разделительные. Реализовать запуск команд конвейром и одно из трех перенаправлений ввода-вывода. В минимальном варианте достаточно реализовать конвейр из двух команд, при наличии в командной строке более чем одного символа «|» выдавать сообщение об ошибке.

Претендующим на отценку «отлично» предлагается реализовать запуск конвейром неограниченного числа команд, а также на выбор (по согласованию с преподавателем) какие-либо две из следующих дополнительных возможностей: