Задание по практикуму на осенний семестр для 215 и 216 групп (2005)
См. оригинал здесь.
Предлагается реализовать интерактивный командный интерпретатор, осуществляющий в цикле считывание командной строки со стандартного ввода, анализ и исполнение соответствующих действий.
Задание выполняется в несколько этапов.
- Написать программу, выполняющую в цикле чтение строк со стандартного ввода и разделяющую строки на отдельные слова.
Любое количество идущих подряд пробельных символов обрабатывается так же, как один пробел.
Текст, заключенный в двойные кавычки, рассматривается как одно слово или часть слова, т.е. внутри двойных кавычек пробельные символы
рассматриваются как обычные символы.
Например:
> aaa «bbb ccc» ddd
aaa
bbb ccc
ddd
> aaaa «bbb»ccc«ddd» eee
aaaa
bbbcccddd
eee
Допускаются строки произвольной длины, т.е. программа должна вести себя корректно вне зависимости от того, какой длины строка подана на ввод (!).
Программа завершает работу в ситуации «конец файла» на стандартном вводе.
Обработка конца файла должна быть реализована корректно.
Требование к коду: в программе после считывания очередной строки должен быть сформирован список полученных слов, и только после этого слова должны выводиться на экран, чтобы продемонстрировать корректную работу.
- Вызов внешних команд.
Модифицировать программу таким образом, чтобы она воспринимала первое полученное слово как имя команды, остальные — как параметры команды и осуществляла исполнение введенных команд (программ, находящихся на диске в директориях, перечисленных в переменной PATH, или указанных по полному имени).
Дополнить программу встроенной командой cd для смены текущего каталога.
- Модифицировать подпрограмму чтения (1-ый этап) таким образом, чтобы она воспринимала символ «&» (если он встречен вне кавычек) как разделительный символ (т.е. символ, который является отдельным словом сам по себе).
Реализовать выполнение команд в фоновом режиме.
Запускать в фоновом режиме команды, последним словом в котором является символ «&».
Если символ «&» встречен не в конце, выдавать сообщение об ошибке.
По завершении команды, выполнявшейся в фоновом режиме, выдавать сообщение о ее завершении и код завершения.
- Модифицировать подпрограмму чтения таким образом, чтобы символы «|» и, в зависимости от варианта, символ «<», «>» или «>>» воспринимались как разделительные.
Реализовать запуск команд конвейром и одно из трех перенаправлений ввода-вывода.
В минимальном варианте достаточно реализовать конвейр из двух команд, при наличии в командной строке более чем одного символа «|» выдавать сообщение об ошибке.
Претендующим на отценку «отлично» предлагается реализовать запуск конвейром неограниченного числа команд, а также на выбор (по согласованию с преподавателем) какие-либо две из следующих дополнительных возможностей: