UNIX_podibni_OS / Unix подобные ОС Лаб. работа 3
.docЛабораторная работа № 3
по курсу «Unix подобные операционные системы»
Переадресация ввода-вывода и командные файлы
1. Использование стандартного ввода-вывода.
Нет разницы между чтением данных из файла и с терминала. Точно так же, если выходные данные программы состоят исключительно из алфавитно-цифровых символов и знаков припинания, нет никакой разницы между записью в файл, выводом на терминал и передачей данных на стандартный ввод другой программы (например, в канал).
Стандартное устройство ввода-вывода предоставляет несколько простейших средств обслуживания ввода-вывода. Таковыми являются три стандартных потока: ввода, вывода и ошибок. В соответствии с соглашением стандартный поток вывода (stdout) содержит все «нормальные» выходные данные программы, в то время как стандартный поток ошибок (stderr) состоит из сообщений об ошибках. Часто бывает удобно обрабатывать стандартный вывод отдельно от сообщений об ошибках. По умолчанию стандартным устройством ввода программы являеться клавиатура, а стандартные потоки вывода и ошибок направляються на экран терминала.
Стандартный поток ввода (stdin) обычно поступает с клавиатуры. Многие программы не используют stdin, и входные файлы указываються непосредственно в командней строке. Например комманда “cat file1 file2” читает не стандартный поток ввода, а непосредственно файлы file1 и file2. Но если в коммандной строке не указаны имена файлов, то, как правило, комманды UNIX, требующие ввода, читают stdin. Обычно стандартный поток ввода поступает с клавиатуры, но shell может переадресовать ввод данных из другого файла. Это удобно для комманд, которые не могут напрямую открывать файлы. Например, для команды mail. Чтобы отправить файл по почте пользователю user3, используется оператор <имя_файла , сообщающий интерпретатору shell, что к стандартному входу программы mail вместо клавиатуры необходимо подключить файл:
% mail user3 < myfile
Основным достоинством стандартного ввода-вывода является возможность переадресации ввода или вывода с терминала в файл. Поскольку терминалы и другие устройства ввода-вывода в UNIX системах рассматриваются как файлы, то программы не могут определить то, куда они посылают свои выходные данные – на терминал или в файл. Если, например, вы хотите соединить два текстовых файла file2 и file3 в один file4, то вы легко можете это сделать с помощью команды cat и функции перенаправления потоков:
% cat file2 file3 > file4
Это называется переадресацией стандартного ввода в файл.
Наиболее распространённой формой переадресации в UNIX является канал, который обозначается оператором | (вертикальная черта). Чтобы, например, направить пользователю user2 файлы file1 и file2 в одном почтовом сообщении нужно воспользоваться следующей командой:
% cat file1 file2 | mail user2
Оператор канала обозначает следующее: ”Подключить стандартный вывод процесса слева (cat) к стандартному вводу процесса слева (mail)”.
Тривиальное использование каналов (конвееров) представить не сложно. Если объём выходных данных велик и они не помещаются на экране, можно передать эти данные программе разбивки на страницы, например more.
|
Действие |
SH |
|
Переадресовать stdout в файл |
Программа > файл |
|
Чтение stdin из файла |
Программа < файл |
|
Переадресовать stdout в конец файла |
Программа >> файл |
|
Чтение stdin с клавиатуры, пока не будет Введён символ c |
Программа <<c |
|
Направить stdout в канал |
Программа1 | Программа2 |
Переадресацию стандартного ввода и вывода можно выполнить в одной командной строке. Например, для выполнения чтения из файла input и записи в файл output нужно выполнить следующую команду:
% программа < input > output
2. Командные файлы.
Командный файл – это не более чем сложная командная строка, сохранённая в файле. Предположим, нужен компактный список всех пользователей, зарегистрированных в вашей системе. Получить такой список позволил следующая команда:
% who | cut –c1-6| sort –u | pr -11 -6 –w78 –t
Список должен быть разбит на столбцы и выглядеть так:
abraham anton barton charlie jerry kosmo
linda peterson root ross sutton
Для получения такого результата необходимо использовать четыре команды UNIX, соеденённые каналами:
-
команда who формирует список всех пользователей;
-
команда cut –c1-6 выризает из вывода команды who столбцы 1-6 – имена пользователей. Если в вашей системе нет команды cut, используйте команду colrm 7;
-
команда sort –u располагает имена по алфавиту и исключает имена пользователей, зарегестрированных более одного раза;
-
команда pr –l1 -6 –w78 –t выводит список имён пользователей в 6 столбцов, при этом длина строк составляет 78 символов.(l1 – это строчная буква L с следующей цифрой 1).
Если вам часто необходим список пользователей, лучше пользоваться командой типа
% loggedin
Команда создаётся следующим образом.
-
С помощью текстового редактора (vi, Emacs или любого другого) создайте новый файл с именем loggedin.
-
В начале файла введите следующую строку: !#/bin/sh
Во второй строке обычно находится комментарий, в котором поясняется, каковы функции данного сценария(командного файла). Пример комментария:
# loggedin – список зарегистрированных пользователей
Поместите следующие команды в третью строку:
who | cut –c1-6| sort –u | pr -11 -6 –w78 –t
-
Сохраните файл и выходите из редактора. Сценарий готов.
-
Далее необходимо сделать сценарий исполняемым. Для этого вам пригодится команда chmod, которая предназначена для изменения прав доступа к файлу. Чтобы сделать командный файл исполняемым вам необходимо выполнить следующую команду:
% chmod +x loggedin
-
Наконец, запустите получившийся командный файл:
% ./loggedin
С помощью данной команды вы запустите ваш командный файл из текущей директории. Чтобы запустить его из любого другого каталога, кроме текущего, необходимо поместить его в каталог /bin или /usr/bin.
Практическое задание
1. Вход в систему.
На рабочем месте запустите виртуальную машину VmWare и загрузите систему Frenzy v0.3.
Чтобы войти в систему наберите root.
2. Применение перенаправления ввода-вывода.
Сразу после входа в систему под пользователем root вы окажетесь в каталоге /root – это домашний каталог суперпользователя (это, кстати, единственное исключение: все вновь создаваемые пользователи и их начальные каталоги по умолчанию помещаются в каталог /home).
Проверьте имя текущего каталога с помощью команды pwd.
Далее просмотрите файлы, находящиеся в этой директории(команда ls).
Создайте текстовый файл templist1 со списком файлов данного каталога с помощью перенаправления вывода команды ls.
Выведите содержание созданного файла templist1 в терминал с помощью команды more.
Используя перенаправление и команду more повторно выведите содержание templist1.
Создайте текстовый файл templist2, в котором будет содержаться список файлов каталога /bin.
Просмотрите содержание созданного файла templist2 в терминал с помощью vi.
Соедините созданные файлы в один файл templist с помощью команды cat (для информации о синтаксисе выполните команду man cat).
Выведите содержание созданного файла templist в терминал с помощью команды more и убедитесь что полученный файл содержит в себе оба файла:templist1 и templist2.
С помощью конвейера и команды sort выведите отсортированный по алфавиту список файлов из файла templist.
Добавьте в конец полученого файла templist текущую дату с помощью команды date.
Выведите содержание файла templist в терминал с помощью команды more и убедитесь, что последняя строка содержит текущую дату и время.
С помощью комбинации клавиш Ctrl+F2 перейдите во второй виртуальный терминал и повторите вход в систему.
Вернитесь в предыдущий терминал с помощью комбинации клавиш Ctrl+F1.
Выполните команду who для просмотра зарегистрированных в системе пользователей.
С помощью конвейера | (вертикальной черты) и команды tee создайте файл temptee, содержащий имена зарегистрированных в системе пользователей. Команда tee записывает выходные данные в файл и одновременно направляет их в стандартный поток ввода. Для получения списка пользователей воспользуйтесь командой who.
Просмотрите созданный файл temptee и вывод команды who.
3. Создание и использование командных файлов.
Создайте коммандный файл myfile, который будет автоматизировать процесс просмотра отсортированного списка файлов вашего домашнего каталога /root (используя команды cd, ls, more).
Для создания этого файла воспользуйтесь редактором vi.
Выведите содержание файла myfile с помощью команды more.
Измените права доступа к myfile (установите право на исполнение) и протестируйте свой командный файл.
Перейдите в свой домашний каталог с помощью команды cd (если не задавать аргументы данной команде в виде пути, то вы автоматически переходите в свой домашний каталог).
Выполните команду pwd, чтобы убедиться что вы действительно находитесь в своем домашнем каталоге.
Выполните команду ./myfile ( ./ - признак, указывающий что запускаемый файл находиться в текущем каталоге).
