Рис.1-34
Двойка перед символом перенаправления в этой конструкции означает порядковый номер (дескриптор) канала ввода-вывода; стандартный ввод и стандартный вывод имеют дескрипторы 0 и 1, соответственно 25, а запись «<���», «>», «>>» является сокращением от «0<���», «1>», «1>>», соответственно 26.
Так же, как и стандартный вывод, вывод ошибок может быть переназначен в конец существующего файла конструкцией «2>>». Если же необходимо переназначить и стандартный вывод, и вывод ошибок в один файл, в командную строку следует, помимо переназначения стандартного вывода включить еще и конструкцию «2>&1», означающую «переназначить второй канал туда же, куда и первый» (Рис. 1-35).
Рис. 1-35
Стандартные файлы-устройства
Бывает желательно подавить стандартный вывод или вывод ошибок вообще. Некоторые команды предусматривают для этого особые ключи, но в общем случае можно воспользоваться все той же возможностью переназначения вывода. Для этого в любой стандартной системе существует специальный файл, представляющий собою фиктивное «нуль-устройство». Его полное имя «/dev/null». Запись в него любых данных не приводит к какому-либо результату, они как бы «бесследно исчезают» 27. В «/dev/null» можно переназначить как стандартный вывод, так и вывод ошибок.
На «/dev/null» можно также переназначить и стандартный ввод; из него всегда читается пустой файл: подача команды «cat пустой_файл» приведет к появлению в текущем каталоге пустого файла «пустой_файл» (или опустошению существующего файла с таким именем).
Еще один интересный специальный файл-устройство – «/dev/tty». Это весьма абстрактное устройство, соответствующее терминалу, с которого запущена оболочка. Перенаправление вывода в или ввода из этого устройства не дает никакого видимого эффекта, поскольку совпадает с умолчанием (можно считать, что, если в команде явным образом не присутствуют перенаправления, ввод-вывод неявным образом направлен так: «/dev/tty 2>/dev/tty»), но его указание может пригодиться для команд, вводящих текст из файла, указанного в качестве операнда, или выводящих текст в такой файл.
Если Алиса взглянет на перечисленные файлы с помощью команды «ls -l» (Рис. 1-36), она обнаружит, что в поле «тип» присутствует не встречавшийся до сих пор символ «c».
Рис. 1-36
Символ «c» означает «устройство с посимвольным вводом-выводом» 28.
Эти файлы устройств должны присутствовать в любой стандартной открытой системе, так же, как и содержащий их каталог «/dev/». Кроме них, в большинстве реализаций этот каталог содержит множество (сотни или даже тысячи) файлов (иногда организованных в подкаталоги), представляющих различные физические или виртуальные устройства. Любое устройство в открытой ОС представлено в виде файла . Некоторые из них (например, терминалы) представляют собой устройства с посимвольным вводом-выводом, некоторые (например, магнитные диски) – с поблочным. Тип файла-устройства с поблочным вводом-выводом обозначается буквой «b».
Оболочка как команда
Пожалуй, наиболее убедительной демонстрацией единства принципов открытых систем является следующий пример. Запишем в файл «сценарий» строки, соответствующие каким-либо уже известным нам командам (например, «date», «cal») и дадим команду «sh <���сценарий» (Рис. 1-37).
Рис. 1-37
Команда «sh» является ни чем иным, как запуском еще одной оболочки, такой же 29, как та, с которой Алиса работает, вводя команды с терминала. Поскольку ввод перенаправлен, команды читаются не с терминала, а из файла.
Последовательность команд, записанная в файл, представляет собой своего рода программу, которую часто называют сценарием или скриптом 30. На самом деле оболочка предоставляет в распоряжение пользователя развитый директивный язык программирования, с основами которого мы познакомимся позже, а пока следует заметить, что значительная часть самих ОС обычно пишется на этом языке.
Читать дальше