ЗАДАНИЕ ПРАКТИКУМА "Модельный Shell-интерпретатор" Предлагается реализовать под управлением ОС Unix интерактивный командный интерпретатор, осуществляющий в цикле считывание командной строки со стандартного ввода, анализ и исполнение соответствующих действий. Задание выполняется в несколько этапов. 1) Написать программу, выполняющую в цикле чтение строк со стандартного ввода и разделяющую строки на отдельные слова. Любое количество идущих подряд пробельных символов обрабатывается так же, как один пробел. Текст, заключенный в двойные кавычки, рассматривается как одно слово или часть слова, т.е. внутри двойных кавычек пробельные символы рассматриваются как обычные символы. Например: > aaa "bbb ccc" ddd aaa bbb ccc ddd > aaaa "bbb"ccc"ddd" eee aaaa bbbcccddd eee Допускаются строки произвольной длины, т.е. программа должна вести себя корректно вне зависимости от того, какой длины строка подана на ввод (!). Программа завершает работу в ситуации "конец файла" на стандартном вводе. Обработка конца файла должна быть реализована корректно. Требование к коду: в программе после считывания очередной строки должен быть сформирован _список_ полученных слов, и только после этого слова должны выводиться на экран, чтобы продемонстрировать корректную работу. 2) Вызов внешних команд. Модифицировать программу таким образом, чтобы она воспринимала первое полученное слово как имя команды, остальные - как параметры команды и осуществляла исполнение введенных команд (программ, находящихся на диске в директориях, перечисленных в переменной PATH, или указанных по полному имени). Дополнить программу _встроенной_ командой cd для смены текущего каталога. 3) Модифицировать подпрограмму чтения (1й этап) таким образом, чтобы она воспринимала символ '&' (если он встречен _вне_ кавычек) как разделительный символ (т.е. символ, который является отдельным словом сам по себе). Реализовать выполнение команд в фоновом режиме. Запускать в фоновом режиме команды, последним словом в котором является символ '&'. Если символ '&' встречен не в конце, выдавать сообщение об ошибке. По завершении команды, выполнявшейся в фоновом режиме, выдавать сообщение о ее завершении и код завершения. 4) Модифицировать подпрограмму чтения таким образом, чтобы символы '|' и, в зависимости от варианта, символ '<', '>' или '>>' воспринимались как разделительные. Реализовать одно из трех перенаправлений ввода-вывода (в зависимости от варианта). 5) Реализовать запуск команд конвейером. В минимальном варианте достаточно реализовать конвейр из двух команд, при наличии в командной строке более чем одного символа '|' выдавать сообщение об ошибке. В полном варианте ограничений на длину конвейера быть не должно. ----------------------------------------- В качестве дополнения к основной части (по требованию преподавателя) реализовать: - связку ';' (сначала выполняется одна команда, потом вторая) - связку '||' (сначала выполняется первая команда, и если она завершилась неудачей, то выполнятеся вторая команда) - связку '&&' (сначала выполняется первая команда, и если она завершилась успешно, то выполнятеся вторая команда) - круглые скобки (содержимое скобок, имеющее произвольную сложность, выполняется как отдельно взятая команда). Эту возможность можно выбирать только вместе с одной из трех предыдущих, в противном случае невозможно проверить ее наличие. - обратные апострофы (подстановка результата выполнения команды). - просмотр и модификацию переменной PATH