Свободные программы и системы в школе _1_26.png
Рис. 1-26

Введя команду «cat» без аргументов (Рис. 1-26), Алиса сталкивается с новой для себя ситуацией: ее подача не приводит ни к какому видимому результату, никакого вывода на экране не появляется, но и подсказки, которая была бы знаком успешного завершения команды, тоже нет. Дело в том, что команда «cat», в отличие от ранее рассмотренных, не только выводит, но и вводит данные.

Вводя произвольные строки22 (Рис. 1-27), Алиса обнаруживает, что каждая введенная ею строка после нажатия Enter вновь выводится на терминал. Команда «cat», поданная без аргумента, копирует содержимое ввода в вывод построчно23 .

Закончить ввод можно, введя в начале очередной строки символ конца файла Control-D. Ввод этого символа приводит к немедленному завершению ввода, т.е. символ завершения строки уже не ожидается, а сам символ не отображается при вводе.

Свободные программы и системы в школе _1_27.png
Рис. 1-27

Говоря в главах выше о выводе, а сейчас и о вводе, мы подразумевали вывод на экран терминала и ввод с клавиатуры терминала. Это является умолчанием для всех стандартных команд. Однако одним из самых важных свойств открытых ОС является возможность перенаправления ввода-вывода .

В примере на Рис. 1-28 Алиса перенаправляет вывод команды «cat», используя символ «>» со следующим за ним именем файла («Вечера»), в который перенаправляется вывод.

Свободные программы и системы в школе _1_28.png
Рис. 1-28

В этом примере строки ввода уже не дублируются выводом на терминал, а поданная после завершения ввода команда «ls» показывает, что действительно появился файл с названием «Вечера» и размером 173 байта, что соответствует длине введенного текста24 .

Перенаправляться может не только вывод, но и ввод, и Алиса может воспользоваться этим, чтобы вывести с помощью все той же команды «cat» содержимое созданного ею файла на терминал. Перенаправление ввода осуществляется указанием имени файла после символа «<» (Рис. 1-29).

Свободные программы и системы в школе _1_29.png
Рис. 1-29

Эти два символа («>» для перенаправления вывода и «<» для перенаправления ввода) легко запомнить, поскольку они графически соответствуют «стрелкам», указывающим «в файл» или «из файла». Промежутки до и после символов «<» и «>» игнорируются.

Перенаправление ввода и вывода может использоваться и одновременно. Команда на Рис. 1-30 копирует построчно файл «Вечера» в файл «Вечера_2».

Свободные программы и системы в школе _1_30.png
Рис. 1-30

Результат, в общем, совпадает с результатом простого копирования «cp Вечера Вечера_2», хотя и достигается другим способом. Порядок указания файлов перенаправления ввода и вывода значения не имеет.

Если файл, в который перенаправляется вывод, уже существует, он будет опустошен. Оболочка при этом может запрашивать подтверждение на опустошение файла.

Часто бывает желательно перенаправить вывод в файл, не уничтожая его содержимого, а дописывая новые строки к уже существующим. Для этого оболочка поддерживает перенаправление вывода в конец существующего файла , обозначаемое «двойной стрелкой» «>>» (Рис. 1-31).

Свободные программы и системы в школе _1_31.png
Рис. 1-31

Как и перенаправление вывода в файл, перенаправление вывода в конец файла может применяться совместно с переназначением ввода.

Важно понимать, что возможность переназначения ввода-вывода является свойством не отдельных программ, а системы в целом. Символы перенаправления и соответствующие имена файлов не передаются самим командам в качестве аргументов. Оболочка самостоятельно назначает файлы ввода-вывода любой команды. В частности, можно переназначить вывод любой из рассматривавшихся выше команд, например, «ls» (Рис. 1-32).

Свободные программы и системы в школе _1_32.png
Рис. 1-32

Кроме стандартного ввода и стандартного вывода, каждая команда открывает еще один файл для вывода ошибок. Команда записывает в стандартный вывод то, что от нее ожидается, а в вывод ошибок – пишет сообщения об ошибках, предупреждения и диагностические сообщения. Как и первые два файла, по умолчанию вывод ошибок ассоциирован с терминалом. Перенаправление стандартного ввода и стандартного вывода не влияет на вывод ошибок.

Свободные программы и системы в школе _1_33.png
Рис. 1-33

В примере на Рис. 1-33 сообщение об отсутствии файла «Вечера_3» было выведено на терминал, хотя стандартный вывод был перенаправлен в файл «список».

Перенаправить вывод ошибок можно, использовав конструкцию «2>» со следующим за ней именем файла (Рис. 1-34).

Свободные программы и системы в школе _1_34.png
Рис.1-34

Двойка перед символом перенаправления в этой конструкции означает порядковый номер (дескриптор) канала ввода-вывода; стандартный ввод и стандартный вывод имеют дескрипторы 0 и 1, соответственно25 , а запись «<», «>», «>>» является сокращением от «0<», «1>», «1>>», соответственно26 .

Так же, как и стандартный вывод, вывод ошибок может быть переназначен в конец существующего файла конструкцией «2>>». Если же необходимо переназначить и стандартный вывод, и вывод ошибок в один файл, в командную строку следует, помимо переназначения стандартного вывода включить еще и конструкцию «2>&1», означающую «переназначить второй канал туда же, куда и первый» (Рис. 1-35).

Свободные программы и системы в школе _1_35.png
Рис. 1-35

Стандартные файлы-устройства

Бывает желательно подавить стандартный вывод или вывод ошибок вообще. Некоторые команды предусматривают для этого особые ключи, но в общем случае можно воспользоваться все той же возможностью переназначения вывода. Для этого в любой стандартной системе существует специальный файл, представляющий собою фиктивное «нуль-устройство». Его полное имя «/dev/null». Запись в него любых данных не приводит к какому-либо результату, они как бы «бесследно исчезают»27 . В «/dev/null» можно переназначить как стандартный вывод, так и вывод ошибок.








Перейти на страницу:
Изменить размер шрифта: