Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по лекциям.doc
Скачиваний:
30
Добавлен:
20.09.2019
Размер:
1.52 Mб
Скачать

12.5. Стандартный ввод-вывод и конвейеры командной строки

Стандартный ввод-вывод предоставляет мощные средства для операций в командной строке. Эти средства основаны на переадресации стандартного ввода-вывода. Большая часть команд операционной системы в их внутренней программной реализации построена таким образом, что для ввода и вывода данных используется исключительно стандартный ввод и вывод. В результате переадресация этого ввода или вывода в командной строке позволяет вместо экрана и клавиатуры использовать желаемые пользователю файлы.

Так, при использовании команды отображения информации о файлах, можно ее задать в виде

dir >имя_файла

(или соответственно ls >имя_файла ) и желаемая информация для будущего употребления запомнится в указанном файле. Ряд команд операционной системы строятся как фильтры, т.е. используют и стандартный ввод, и стандартный вывод. К таким командам относятся команды sort, more (общие для всех рассматриваемых ОС) и команда wc из Unix, которая подсчитывает число строк, слов и символов в файле, служащем для ввода информации (в частности, текста, вводимого с клавиатуры).

Практическое значение стандартного ввода-вывода особенно велико в связи с применением так называемых конвейеров в командной строке. Конвейер представляет заданное в команде связывание стандартного вывода одной команды с стандартным вводом другой – следующей в строке – команды. В качестве символа связывания команд в конвейер используется символ | (одинарная вертикальная черта). Конвейер по внешнему виду представляет запись

команда1 | команда2

Здесь стандартный вывод команды команда1 автоматически связывается со стандартным вводом команды команда2. Поэтому данные результата первой команды не появляются на экране, а полностью передаются на вход второй команды, которая и использует их в качестве обрабатываемой ее информации. В одной составной команде может быть построен конвейер не только из двух, но и из любого числа команд, соединенных при записи символом вертикальной черты. Единственное требование при этом заключается в том, что для соединяемых таким путем команд первая из них должна использовать стандартный вывод, а вторая – стандартный ввод.

Практически наиболее часто в конвейерах используется команда more, которая оказывается заключительной в конвейере, поскольку выводит на экран, а не в стандартный вывод. Ее значение в том, что вывод на экран производится порциями по размеру экрана, это позволяет удобно наблюдать результаты объемного вывода на экране, где без ее использования часть выводимых данных исчезает – автоматически выдвигается за верхнюю границу экрана. Даже в операционных системах типа MS эта вспомогательная команда достаточно широко используется при текстовом выводе информации, в частности в составной команде

dir | more

(хотя следует помянуть, что модифицированная версия команды dir позволяет добиться того же эффекта с помощью дополнительной опции, но при этом надо помнить написание опции, а возможности команды more более универсальны и применимы с любой другой командой).

В Unix для использования конвейеров существует дополнительная команда tee, которая в качестве единственного аргумента требует указания имени файла и передавая данные со своего стандартного ввода на стандартный вывод одновременно запоминает передаваемые данные в заданном для нее файле. Она как бы кроме простой передачи с входа на выход еще и протоколирует все данные в файле.

При использовании стандартного ввода-вывода иногда возникает проблема запоминания сообщений об ошибках. Для вывода информации об ошибках предназначен стандартный поток ошибок, имеющий константное значение хэндла в Unix и OS/2, равное 2, причем этот вывод об ошибках по умолчанию поступает на экран.

Для переадресации стандартного ввода и стандартного вывода, как уже описывалось в гл. 2, в командной строке используются вспомогательные символы '<' и '>' соответственно. Для переадресации стандартного потока ошибок используется запись вида

команда 2>имя_файла

Предоставляется также возможность направлять данные об ошибках в стандартный поток обычного вывода. Для этого предназначена запись вида

команда 2>&1

Наконец, существует возможность при необходимости перенаправить стандартный вывод в стандартный поток ошибок, что задается записью

команда 1>&2

При использовании переназначений с помощью символов обозначений >имя_файла предыдущее содержимое файла с именем имя_файла теряется (внутренними процедурами файл открывается для записи с усХчением Фо нуля предыдущеУо содержимоУо). В ряде случаХв, особенно при протоколированШи ошШбок, может представлять интерес сохранение предыдущего содержимого указанного таким образом файла и приписывание в его конец новых данных. Для решений этой задачи предлагается использовать вместо одного символа '>' два таких символа подряд и без разрыва между ними.

В частности команда

команда <файл1 >файл2 2>>файл3

указывает – брать исходные данные в файле файл1, помещать данные стандартного вывода в файл файл2 и дописывать в конец файла файл3 сообщения стандартного потока ошибок текущей команды команда.