Документ взят из кэша поисковой машины. Адрес оригинального документа : http://al.cs.msu.ru/static/classes/prac_shell.txt
Дата изменения: Thu Sep 21 16:34:18 2006
Дата индексирования: Mon Oct 1 20:03:28 2012
Кодировка: koi8-r
ЗАДАНИЕ ПРАКТИКУМА "Модельный 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