Тема: Программные и аппаратные принципы ввода-вывода

Практическая работа № 14, 15

Цели: Ознакомиться с основами основными принципами организации ввода-вывода в ОС Linux при использовании командной оболочки Shell.

Теоретический материл

Обычно в ОС UNIX доступны несколько интерпретаторов. Наиболее распространены Bourne-shell (или просто - shell), C-shell, Korn-shell. В идейном плане все эти интерпретаторы близки и в дальнейшем речь будет идти о стандартном Shell (/bin/sh).

Работая на командном языке, пользователь может вводить переменные, присваивать им значения, выполнять простые команды, строить составные команды, управлять потоком выполнения команд, объединять последовательность команд в процедуры (командные файлы). На уровне командного языка доступны такие свойства системы как соединение процессов через программный канал, направление стандартного ввода/вывода в конкретные файлы, синхронное и асинхронное выполнение команд.

Если указанный интерпретатору файл является текстовым и содержит команды командного языка (командный файл) и при этом имеет разрешение на выполнение (помечен "х"), Shell-интерпретатор интерпретирует и выполняет команды этого файла. Другой способ вызова командного файла - использование команды sh (вызов интерпретатора), в котором первым аргументом указывается имя командного файла.

Коротко перечислим средства группирования команд и перенаправления ввода/вывода:

· cmd1 arg ...; cmd2 arg ...; ... cmdN arg ... - последовательное выполнение команд;

· cmd1 arg ...& cmd2 arg ...& ... cmdN arg ... асинхронное выполнение команд;

· cmd1 arg ... && cmd2 arg ... - зависимость последующей команды от предыдущей таким образом, что последующая команда выполняется, если предыдущая выдала нулевое значение;

· cmd1 arg ... || cmd2 arg ... - зависимость последующей команды от предыдущей таким образом, что последующая команда выполняется, если предыдущая выдала ненулевое значение;

· cmd > file - стандартный вывод направлен в файл file;

· cmd >>

· file - стандартный вывод направлен в конец файла file; cmd < file - стандартный ввод выполняется из файла file;

· cmd1 | cmd2 - конвейер команд, в котором стандартный вывод команды cmd1 направлен на стандартный вход команды cmd2.

Shell-переменные могут хранить строки текста. Правила формирования их имен аналогичны правилам задания имен переменных в обычных языках программирования. При необходимости присвоить Shell-переменной значение, содержащее пробелы и другие специальные знаки, оно заключается в кавычки. При использовании Shell-переменной в выражении ее имени должен предшествовать знак $. В последовательности символов те из них, которые составляют имя, должны быть выделены в { } или " ". Кроме того интерпретатор Shell автоматически присваивает значения пяти своим переменным:

1. $? - значение, возвращаемое последней выполняемой командой;

2. $$ - идентификационный номер процесса Shell;

3. $! - идентификационный номер фонового процесса, запускаемого

1. интерпретатором Shell последним;

4. $# - число аргументов, переданных в Shell;

5. $- - флаги, переданные в Shell.

Для отмены специальных символов ($,|,пробел и т.д.) в Shell-программах существуют следующие правила:

1. 1. если символу предшествует обратная косая черта, то его специальный символ отменяется;

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

При вызове Shell-программ им могут передаваться параметры. Соответствующие аргументы в Shell-программах идентифицируются $1, $2, $3 и т.д. Кроме того, переменная $0 соответствует имени выполняемой Shell-программы, а переменная $# - числу аргументов в команде.

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

Наиболее важные команды для составления Shell-программ:

· команда echo выводит в выходной поток значения своих аргументов;

· команда expr выполняет арифметические действия над своими аргументами;

· команда eval обеспечивает дополнительный уровень подстановки своих аргументов, а затем их выполнение;

· команда test с соответствующими ключами проверяет необходимое условие;

· команда sleep служит для реализации задержки.

Программные конструкции Shell-программ:

Задание.

1. Изучить программные средства языка Shell (структура команды, группирование команд, перенаправление ввода-вывода, конвейер команд, Shell-переменные, макроподстановка результатов в Shell-командах, программные конструкции). Ознакомиться с заданием к лабораторной работе.

2. Ознакомится с организацией ввода-вывода в Linux.

3. Для указанного варианта составить Shell-программу, выполняющую требуемые действия в файловой системе.

4. Отладить и оттестировать составленную Shell-программу.

Варианты заданий

1. Shell-программа подсчитывает количество и выводит список всех файлов (без каталогов) в порядке уменьшения их длин в поддереве, начиная с каталога, имя которого задано параметром Shell-программы. Форма вывода результата:

2. Shell-программа подсчитывает количество и выводит перечень каталогов в хронологическом порядке (по дате создания) в поддереве, начиная с каталога, имя которого задано параметром Shell-программы. Форма вывода результата:

3. Задание варианта 1, но список файлов в каталоге выводится в алфавитном порядке.

4. Shell-программа объединяет все временные файлы с указанным суффиксом (например, .tmp) в поддереве, начиная с каталога, имя которого задано параметром Shell-программы. Результат объединения помещается либо в указанный Shell-программой файл, либо выводится на экран в форме:

5. Shell-программа периодически с некоторым интервалом удаляет все временные файлы с указанным суффиксом (например, .tmp) в поддереве, начиная с каталога, имя которого задано параметром Shell-программы и выводит при этом список объединенных файлов в форме, предложенной в варианте 1.

6. Shell-программа просматривает каталог, имя которого указано параметром Shell-программы и выводит имена встретившихся каталогов. Затем осуществляет переход в родительский каталог, который становится текущим и повторяются указанные действия до тех пор, пока текущим каталогом не станет корневой каталог. Форма вывода результата:

7. Задание, аналогичное варианту 6, но выводятся не каталоги, а файлы каталогов.

8. Shell-программа выводит имена тех каталогов в каталоге, которые в себе не содержат каталогов. Имя каталога задано параметром Shell-программы.

9. Shell-программа выводит имена тех каталогов в каталоге, которые в себе содержат каталоги. Имя каталога задано параметром Shell-программы.

10. Shell-программа выводит содержимое каталога, имя которого указано параметром Shell-программы. При выводе сначала перечисляются имена каталогов, а затем в алфавитном порядке имена файлов с указанием их длин, даты создания и числа ссылок на них.

Контpольные вопpосы

1. Что такое внутренние и внешние команды Shell-интерпретатора? Приведите примеры внутренних команд.

2. Какие существуют средства группирования команд? Приведите примеры использования.

3. Как осуществляется перенаправление ввода-вывода?

4. В чем сущность конвейера команд? Приведите примеры использования.

5. Как средствами Shell выполнить арифметические действия над Shell-переменной?

6. Каковы правила генерации имен файлов?

7. Как выволняется подстановка результатов выполнения команд?

8. Как интерпретировать строку cmd1 & cmd2 & ?

9. Как интерпретировать строку cmd1 && cmd2 & ?

10. Как интерпретировать строку cmd1 || cmd2 & ?

11. В каком режиме выполняется интерпретатор команд Shell?

12. Кем и в каком режиме осуществляется чтение потока символов с терминала интерпретатором Shell?

Задание на дом.

Выполнить отчет по практической работе.