Шрифт:
Так же, как и стандартный вывод, вывод ошибок может быть переназначен в конец существующего файла конструкцией «2>>». Если же необходимо переназначить и стандартный вывод, и вывод ошибок в один файл, в командную строку следует, помимо переназначения стандартного вывода включить еще и конструкцию «2>&1», означающую «переназначить второй канал туда же, куда и первый» (Рис. 1-35).
Стандартные файлы-устройства
Бывает желательно подавить стандартный вывод или вывод ошибок вообще. Некоторые команды предусматривают для этого особые ключи, но в общем случае можно воспользоваться все той же возможностью переназначения вывода. Для этого в любой стандартной системе существует специальный файл, представляющий собою фиктивное «нуль-устройство». Его полное имя «/dev/null». Запись в него любых данных не приводит к какому-либо результату, они как бы «бесследно исчезают» [27] . В «/dev/null» можно переназначить как стандартный вывод, так и вывод ошибок.
27
Отсюда фольклорное название «битодробилка» и многочисленные шутки, касающиеся того, как бы могло выглядеть соответствующее устройство, выполненное «в железе», и как бороться с переполнением «/dev/null».
На «/dev/null» можно также переназначить и стандартный ввод; из него всегда читается пустой файл: подача команды «cat </dev/null >пустой_файл» приведет к появлению в текущем каталоге пустого файла «пустой_файл» (или опустошению существующего файла с таким именем).
Еще один интересный специальный файл-устройство – «/dev/tty». Это весьма абстрактное устройство, соответствующее терминалу, с которого запущена оболочка. Перенаправление вывода в или ввода из этого устройства не дает никакого видимого эффекта, поскольку совпадает с умолчанием (можно считать, что, если в команде явным образом не присутствуют перенаправления, ввод-вывод неявным образом направлен так: «</dev/tty >/dev/tty 2>/dev/tty»), но его указание может пригодиться для команд, вводящих текст из файла, указанного в качестве операнда, или выводящих текст в такой файл.
Если Алиса взглянет на перечисленные файлы с помощью команды «ls -l» (Рис. 1-36), она обнаружит, что в поле «тип» присутствует не встречавшийся до сих пор символ «c».
Символ «c» означает «устройство с посимвольным вводом-выводом» [28] .
Эти файлы устройств должны присутствовать в любой стандартной открытой системе, так же, как и содержащий их каталог «/dev/». Кроме них, в большинстве реализаций этот каталог содержит множество (сотни или даже тысячи) файлов (иногда организованных в подкаталоги), представляющих различные физические или виртуальные устройства. Любое устройство в открытой ОС представлено в виде файла. Некоторые из них (например, терминалы) представляют собой устройства с посимвольным вводом-выводом, некоторые (например, магнитные диски) – с поблочным. Тип файла-устройства с поблочным вводом-выводом обозначается буквой «b».
28
Также в строках вывода команды «ls -l» отсутствует поле «размер»; его место занимают пары чисел, называемых старшим и младшим номерами устройства (в данном случае «5, 1», «1, 3» и «5, 0»). Их значения зависят от конкретной реализации и интересны, как правило, администратору системы, но не обычному пользователю.
Оболочка как команда
Пожалуй, наиболее убедительной демонстрацией единства принципов открытых систем является следующий пример. Запишем в файл «сценарий» строки, соответствующие каким-либо уже известным нам командам (например, «date», «cal») и дадим команду «sh <сценарий» (Рис. 1-37).
Команда «sh» является ни чем иным, как запуском еще одной оболочки, такой же [29] , как та, с которой Алиса работает, вводя команды с терминала. Поскольку ввод перенаправлен, команды читаются не с терминала, а из файла.
29
В большинстве реальных ситуаций пользователь работает не со стандартной оболочкой «sh», а с усовершенствованной оболочкой, такой как «bash» или «zsh», совместимой сверху вниз со стандартной. При этом команда «sh» может быть, в зависимости от конкретной ОС, либо синонимом такой усовершенствованной, либо также включенной в систему строго стандартной оболочкой.
Последовательность команд, записанная в файл, представляет собой своего рода программу, которую часто называют сценарием или скриптом [30] . На самом деле оболочка предоставляет в распоряжение пользователя развитый директивный язык программирования, с основами которого мы познакомимся позже, а пока следует заметить, что значительная часть самих ОС обычно пишется на этом языке.
«Владение» файлом и «права» на него
30
От англ. «script» («сценарий»).
Рассмотрим следующий пример (Рис. 1-38).
Алиса известными нам уже командами «touch» и «ls» создает файл «файл» и убеждается в том, что он на самом деле создан. Затем она выполняет команду «chmod u-w файл» и обнаруживает, что поле «тип и права доступа» в выдаче «длинного» списка файлов претерпело некоторые изменения. Попытка перенаправить в этот файл ввод порождает сообщение оболочки «В доступе отказано».
Вспомним еще раз значения полей в «длинном» формате списка файлов, получаемого по команде «ls -l» (Рис. 1-39).
Вот как устроено поле «тип и права» (Рис. 1-40).
Оно всегда содержит десять символов. Значение первого символа нам уже известно: это «тип файла», которому могут соответствовать «-» (обычный файл), «d» (каталог) и некоторые другие символы, соответствующие специальным файлам (таким, как файлы устройств).
Остальные девять символов составляют три триады, выражающие права на файл в так называемой «rwx»-нотации. Они соответствуют трем категориям пользователей, определяемым относительно каждого файла.