Свободные программы и системы в школе — страница 11 из 36

Рис. 1-23

Экранировать бэкслэшем можно любой специальный символ. Если необходимо, чтобы в цепочке был раскрыт сам символ «\», он также экранируется.

[alice@wonderland Старые_файлы]$ echo Cпециальные символы в шаблонах – это вопросительный знак \?, звездочка \*, квадратные скобки \[ и \]. Их можно экранировать обратной косой чертой \\

Cпециальные символы в шаблонах – это вопросительный знак ?, звездочка *, квадратные скобки [ и ]. Их можно экранировать обратной косой чертой \

Рис. 1-24

Другой способ экранировать специальные символы от интерпретации как шаблонных – заключить имя файла целиком в апострофы («'») или кавычки («"»).

Рис. 1-25

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

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

Оболочка не придает никакого особого значения точке в имени файла (кроме случаев, когда имя начинается с точки), и «расширение имени файла» – это лишь интерпретация пользователя (и, возможно, некоторых программ). Поэтому в отличие от ряда альтернативных систем шаблон «*.» означает не «все файлы с именами без расширений» (как в «РСЭКС-11» или «МС-ДОС»), но буквально «все файлы с именами, заканчивающимися на точку».

Перенаправление ввода-вывода

Команды «cp», «ls», «mkdir», «mv», «rm», «rmdir», «touch», с помощью которых Алиса манипулировала файлами в примерах выше, обычно относят к «файловым утилитам». Все они позволяют манипулировать файлом (копировать, выводить информацию о нем, переименовывать или перемещать, создавать) как единым целым. Любые действия файловых утилит совершенно безразличны к содержимому файлов.

Команда «cat» обычно относится к «текстовым утилитам». Строго говоря, она может обрабатывать и двоичные файлы, но применительно к ним, как правило, операция объединения (а именно объединение содержимого нескольких файлов в один и является «титульной» функцией этой команды, название которой представляет собой сокращение от английского «(con)catenate» – «(кон)катенировать», «сцеплять») бессмысленна.

Рис. 1-26

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

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

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

Рис. 1-27

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

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

Рис. 1-28

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

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

Рис. 1-29

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

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

Рис. 1-30

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

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

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

Рис. 1-31

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

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

Рис. 1-32

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

Рис. 1-33

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

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

Рис.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/». Кроме них, в большинстве реализаций этот каталог содержит множество (сотни или даже тысячи) файлов (иногда организованных в подкаталоги), представляющих различные физические или