Текст
                    МАТЕМАТИЧЕСКОЕ
ОБЕСПЕЧЕНИЕ
ЭВМ
П. Браун
ВВЕДЕНИЕ
В ОПЕРАЦИОННУЮ
СИСТЕМУ UNIX


Введение в операционную систему UNIX
STARTING WITH UNIX P. J. Brown МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ П.Браун ВВЕДЕНИЕ В ОПЕРАЦИОННУЮ СИСТЕМУ UNIX Addison-Wesley Publishing Company Reading, Massachusetts • Menlo Park, California • London Amsterdam • Don Mills, Ontario-Sydney This book is not sponsored or approved or connected with Bell Laboratories. All references to UNIX in the text of this book are to the trademark of Bell Laboratories. Перевод с английского Ю. В. Ступина под редакцией Ю. М. Байковского и Н. Б. Дерябина Москва «Мир» 1987
ББК 32.973 Б 87 УДК 681.142 ОТ РЕДАКТОРОВ ПЕРЕВОДА Браун П. Б 87 Введение в операционную систему UNIX: Пер. с англ.— М.: Мир, 1987.— 288 с., ил. Книга американского специалиста, содержащая описание основных возмож- ностей операционной системы UNIX, которая приобрела большую популяр- ность среди пользователей ЭВМ. В настоящее в^емя эта система имеется на ЭВМ серии СМ-4, ведутся работы по переносу ее на другие ЭВМ. Для программистов разной квалификации. Б 170^°-^ 29-87, ч. I ББК 32. 973 Редакция литературы по математическим наукам ©I 1984 Addison-Wesley Publishers Limited © перевод на русский язык, «Мир», 1987 О популярности системы UNIX свидетельствует хотя бы тот факт, что выпущенные в недавнее время книги были раскуплены мгновенно. В них довольно полно описана система UNIX, но они рассчитаны на читателей, имеющих определенные знания и опыт в области вычислительной техники и программирования. Однако пользователи системы UNIX — это не только профессиональные программисты и даже далеко не в первую очередь профессиональ- ные программисты. Система UNIX используется людьми самых разных профессий. Настоящая же книга является вводной и рас- считана на самый широкий круг читателей — всех тех, кто ничего или почти ничего не знает о системе UNIX и хочет познакомиться с ней и научиться в ней работать. Изучая любую операционную систему, желательно, конечно иметь эту систему «под рукой», чтобы можно было тут же с терми- нала набирать команды и получать на них ответы. Однако да- леко не всегда такая возможность имеется. Книга построена так, что по ней можно изучать UNIX и без компьютера. С этой целью примеры в тексте сопровождаются как бы снимками с экрана терминала, на которых показано все, что введено пользо- вателем и выведено системой на данный момент. Даются также полные примеры сеансов работы с системой. Тем, кто действительно собирается работать в системе UNIX, книга поможет овладеть азами системы на уровне, достаточном для самостоятельного изучения системной документации. Полезной для начинающего пользователя системы будет небольшая сводка наиболее важных команд, приведенная в приложении. Заслуживает внимания подход автора к изложению материа- ла. В первой части книги излагаются идеи, положенные в основу UNIX, а во второй части рассматривается конкретная реали- зация этих идей в системе. Это дает возможность читателю сна- чала, не вдаваясь в детали, сосредоточиться на основах системы, а затем проследить, как цели и задачи системы воплощены на прак- тике. Пользователи UNIX — веселый народ, можно сказать, что шутки были заложены в саму основу системы UNIX. Книга
6 От редакторов перевода легка для чтения еще и потому, что буквально изобилует юмором. Она доставит удовольствие и в дороге, и на отдыхе. Система UNIX в настоящее время явлг<ется одной из наиболее распространенных операционных систем. Многие другие совре- менные операционные системы для болщццх и малых ЭВМ ос- нованы на идеях, близких к системе Unix. Поэтому знание системы UNIX по существу необходимо Современному програм- мисту. Мы верим, что данная книга окажется полезной широко- му кругу читателей, связанных с использованием вычислитель- ной техники. Ю. М. Банковский Н. Б. Дерябин
ПРЕДИСЛОВИЕ Операционная система UNIX располагает мощными и гибкими средствами, благодаря которым ЭВМ может делать то, что вы захотите. Если у вас есть хотя бы небольшие начальные познания в области информатики, то вы увидите, что философия системы UNIX чрезвычайно проста и изящна. Почти каждый, кто поста- рался понять идеи и методы, лежащие в основе UNIX, скажет, что время потрачено не зря: система позволила достичь предела яс- яосттз, удобства и даже вызвала восхищение. Эта книга поможет вам получить определенные знания о системе и достаточно под- робно ознакомит с тем, как работать с UNIX. Она написана просто, легко читается, в меру серьезна, без лишней строгости. Книга предназначена для начинающих. От вас, читатель, тре- буется лишь, чтобы вы видели компьютер и работали на нем хотя бы полчаса (игры не в счет). Даже если вы на самом деле и не поняли, что делали, то по крайней мере узнали, как выглядит терминал и запоминающая среда (например, гибкий диск) и как может осуществляться диалог между человеком и ЭВМ. Вполне возможно, что вы намереваетесь использовать UNIX исключительно для подготовки текстового материала — отчетов, сочинений, писем, книг; в этом случае, быть может, вам никогда не приходилось писать программы и наверное никогда не понадо- бится этого делать. Возможно, напротив, вы являетесь опытным программистом и интересуетесь системой UNIX как основой для программирования. В любом случае книга ничего не предпола- гает о вас, кроме того, что вы — начинающий пользователь UNIX. Тем читателям, которые уже знают какую-либо операцион- ную систему, мы советуем забыть то, что им известно и начать изучение системы заново на свежую память. Как уже было сказа- но, UNIX имеет свою собственную методику организации вычис- лений, и если в вашей голове закрепились другие понятия, то вы никогда не подружитесь с UNIX. Кстати говоря, это прият- ная новость для тех, кому никогда не приходилось использовать какие-либо операционные системы и абсолютно неизвестно, что это такое; такие «абсолютные» начинающие, с открытой душой, могут на самом деле овладеть UNIX быстрее многоопытных.
8 Предисловие Организация книги Во многих книгах изложение материала начинается с подробного объяснения того, как использовать UNIX. В этой книге приме- нен другой подход. Мы твердо уверены, что стоит затратить па- ру часов на изучение основных концепций UNIX, прежде чем вдаваться в детали. Книга поэтому разделена на две части: в части I объясняются идеи и концепции UNIX, а в части II по- казано, как использовать UNIX. Можно указать четыре причины такого подхода: • если понятны идеи, детали изучить легче. Обратное неверно; • система UNIX сама располагает диалоговыми средствами, ко- торые информируют вас о деталях вашей локальной системы. Поэтому приобретение книги с описанием этих же деталей может оказаться нецелесообразным; • детали со временем изменяются, а концепции нет; • UNIX внедрена на многих компьютерах, и конкретные дета- ли реализаций отличаются друг от друга. Версии UNIX На последних двух причинах стоит остановиться подробнее. Ис- пользуемая вами версия UNIX зависит от поставщика, типа ЭВМ и даты приобретения. В настоящее время существует большое число систем «типа UNIX», которые имеют названия, близкие к UNIX. Пусть это разнообразие названий вас не смущает: боль- шинство таких систем действительно выглядят как UNIX, и кон- цепции, описанные в этой книге, применимы ко всем этим систе- мам, хотя исключения неизбежны. (В книге излагается так называемая «версия 7» системы UNIX.) Благодарности При подготовке книги мне посчастливилось получить большую помощь и советы от многих коллег. Среди коллег в Кенте, кото- рым я наиболее обязан, я назову следующих: Майк Бейлисс, Питер Коллинсон (более всего), Симон Крофт, Урсула Фуллер, Ричард Хелльер, Ян Аттинг и Дейвид Вуд; от коллег из других мест — Дейвид Дьюс, Эрик Фоксли, Брайан Рейд, Крис Таваре, Кен Томпсон и Дуглас Вудолл. Я также признателен двум прек- расным машинисткам Юдит Фармер и Марианне Конг, которые перевели «иероглифы» с бумаги в соответствующие ясные образы битов на диске. В заключение я должен поблагодарить Хедер Бра- ун: самые плохие места этой книги были выжжены ее язвитель- ными остротами. Питер Браун Кентербери, август 1983 Предисловие 9 * * * Издательство Addison-Wesley благодарит за разрешение воспро- извести отрывок из стихотворения У. X. Одена «Кто есть кто», опубликованного в сборнике «Избранные стихотворения» под ре- дакцией Эдварда Мендельсона, изданного UK and Common wealth © Faber and Faber Ltd, London, US and Open © Ran- dom House, Inc. New York. Издательство также хочет поблагодарить Д. Фарриса за ка- рикатуры и М. Хенрикса за рисунок на обложке книги 1). 11 Имеется в виду рисунок на обложке английского издания книги Прим, перев.
ЧАСТЬ I ИДЕИ И КОНЦЕПЦИИ ГЛАВА 1 ВВЕДЕНИЕ Гремучая змея — дружелюбная особа, но вы должны вести себя с ней правильно. Книга о змеях UNIX является примером операционной системы, т. е. програм- мы, которая управляет работой ЭВМ. Если вы хотите воспользо- ваться какими-либо средствами ЭВМ — игровой программой или ультрасовременным печатающим устройством — прежде всего вы должны овладеть операционной системой. Образно говоря, между вами и ЭВМ проходит операционная система. Следствием этого является то, что операционная система встает на вашем пути и даже мешает получить желаемые вам средства. Первые операционные системы были созданы примерно в 1950 г., и с тех пор разработаны тысячи различных операционных систем. Многие из них оказались массивными, сложными, недо- работанными, а потому стали гигантским барьером для каждого,
Гл. 1. Введение 11 кто хотел использовать ЭВМ. Постепенно разработчики операци- онных систем стали уделять больше внимания человеческим пот- ребностям пользователя. Недавно вошел в употребление безобраз- ный термин «дружелюбный по отношению к пользователю», означающий, что операционная система помогает своим пользова- телям, а не мешает им. Из тысяч существовавших операционных систем многие были настолько недружелюбны, что разогнали всех своих пользовате- лей; затем, достигнув, по-видимому, своей цели изгнания людей, эти системы умерли в запустении. Тем не менее, несмотря на громадную «смертность», в настоящее время в употреблении еще остаются сотни различных операционных систем. Виды операционных систем Операционные системы бывают всех видов и размеров. Одни из них разрабатываются для крошечных ЭВМ, другие предназна- чены для гигантских ЭВМ, устанавливаемых, скажем, в главных конторах авиакомпаний. Некоторые операционные системы слу- жат для определенного класса пользователей, например для военных или профессиональных специалистов по информатике. Другие, наподобие UNIX,—'Мастера на все руки. Операционные системы отличаются также по своей доступно- сти. Операционная система может быть связана с ЭВМ одного типа или же она может годиться для многих различных типов ЭВМ. Система UNIX создавалась для одного типа ЭВМ, но бла- годаря своему успеху она в настоящее время реализована на большом числе ЭВМ различных типов. Сейчас, вероятно, она является наиболее доступной операционной системой в мире. Диапазон ее применения — от огромных вычислительных систем до относительно скромных микрокомпьютеров. В этой книге мы используем термин реализация UNIX, чтобы описать версию UNIX применительно к одной конкретной ЭВМ. Благодаря своим разнообразным местам обитания UNIX имеет много вариантов, В действительности реализации UNIX могут отличаться даже для двух идентичных ЭВМ. Вследствие этого некоторые детали в книге — особенно в примерных сеансах ра- боты с системой — могут слегка отличаться от реализации вашей системы UNIX. Эти отличия обычно не имеют какого-либо суще- ственного значения. Дружелюбна ли система UNIX? Когда вы присоединяетесь к новой группе людей, то вашими пер- выми друзьями становятся, вероятно, наиболее разговорчивые из них: те, кто с готовностью подходит к вам и рассказывает
12 Часть I. Идеи и концепции все, что вы хотите знать о вашем новом окружении. По прошест- вии времени вы находите, что болтуны тяготят вас, а спустя некоторое время становятся совершенно невыносимыми. Вы за- вязываете новую и более прочную дружбу с серьезными и мол- чаливыми людьми, которые, возможно, сначала казались вам до- вольно непривлекательными. То же самое происходит и при зна- комстве с операционными системами. Вы найдете UNIX среди серьезных и молчаливых систем. UNIX не особенно дружелюбна при первом знакомстве; она также и невраждебна — просто от- части безразлична. По мере углубления знакомства с системой вы обнаружите, что ваша дружба расцветает и, возможно, станет достаточно крепкой на всю жизнь. Виды терминалов В конце 60-х и начале 70-х годов люди общались с ЭВМ, исполь- зуя терминал, очень напоминающий пишущую машинку. Такие терминалы еще используются и сегодня, хотя они уже больше не доминируют. Литеры, которые вы набираете при работе с таким терминалом, не только печатаются на заправленной в машинку бумаге, но и передаются в ЭВМ. Когда ЭВМ хочет сообщить вам что-либо, она берет управление пишущей машинкой на себя и печатает сообщение на бумаге. В настоящее время большинство терминалов состоит из дис- плейных устройств, напоминающих телевизионные экраны — в ряде случаев это обычные телевизоры — и клавиатуры. То, что вы набираете на клавиатуре, изображается на экране, а когда ЭВМ хочет сказать вам что-либо, свое сообщение она высвечивает на экране. То, что появляется на экране, почти идентично тому, что было бы напечатано на бумаге пишущей машинки. Некоторые люди еще предпочитают использовать терминалы на основе пишущих машинок или другие виды печатающих терми- налов. Эти терминалы имеют два достоинства: во-первых, они дают вам твердую копию, т. е. напечатанный материал вы можете хранить или передать кому-нибудь; во-вторых, они не разделяют недостатка дисплейных терминалов, состоящего в том, что одно- временно на экране могут изображаться только 24 строки текста (или около этого). Многие современные системы UNIX основываются главным образом на дисплейных терминалах, но имеют один печатающий терминал, используемый, когда требуется твердая копия. (В со- став некоторых систем входит специальное печатающее устрой- ство, которое используется исключительно для вывода на печать и не может работать в качестве терминала.) Система UNIX может использоваться одинаково хорошо с дисплейного или печатающего терминала. Так, примеры в этой
Гл. 1. Введение 13 книге не зависят от типа используемого вами терминала. Мно- гие термины информатики до сих пор основываются на представ- лении времен пишущих машинок. В частности, если вы работаете с дисплейным терминалом, то вам придется употреблять выраже- ние, что ЭВМ «печатает» что-либо на вашем терминале, в то время как фактически это означает, что она выводит сообщения на экран дисплея. В документации по системе UNIX существует несколько мест, где слово «печать» означает «вывод на дисплей». В книге мы будем придерживаться термина «вывод на дисплей» и зарезервируем слово «печать» для случаев, когда текст действи- тельно печатается. Пример Чтобы дать возможность почувствовать, что такое система UNIX, ниже мы приведем выдержку из сеанса работы с ней. Однако мы должны подчеркнуть, что на этой стадии нас интересуют не де- тали — они излагаются во второй части книги,— а общие прин- ципы. В нашем примере текст, набираемый пользователем, выде- лен жирным шрифтом, чтобы отличить его от ответов UNIX. $ Is bridgegame gamel game2 jobletter796 jobletter797 jobletter798 $ cat jobletter798 Дорогой сэр, Извините, что я не смог приехать на собеседование на прошлой неделе, поскольку по телевизору был хороший фильм из серии ужасов, и я не хотел его пропускать. Я хочу приехать на новое собеседование в среду после обеда на следующей неделе, хотя я должен уехать обратно в 4.30, чтобы пойти на футбольный матч. Я знатак системы UNIX, особенно игровых программ, поэтому буду ведьма полезен вашей фирме. искренне ваш, $ spell jobletter798 знатак $ ed jobletter798 434 /знатак/ Я знатак системы UNIX, особенно игровых программ,
14 Ч асть I. Идеи и концепции s/так/ток/р Я знаток системы UNIX, особенно игровых программ, W 434 q Для начинающих приведенный выше пример может показать- ся совершенно непонятным, но его довольно просто можно объяс- нить. В первой строке UNIX выводит подсказку (приглашение), говоря этим, что система готова принимать информацию от поль- зователя. Подсказкой служит знак доллара, за которым следует пробел. Пользователь набирает 1s, что является командой UNIX — выдать список имен всех файлов пользователя. Фай- лы — это одно из наиболее важных средств UNIX, и позднее мы их обсудим подробно. Пока же представьте себе файл как некото- рую информацию, любого, какого хотите, содержания, хранимую внутри ЭВМ; каждый файл идентифицируется именем, выбранным пользователем. В приведенном выше примере пользователь имеет шесть файлов. Мы будем предполагать, что эти файлы возникли следующим образом. Первые три файла, которые пользователь назвал bridgegame, gamel и game2, связаны с играми. Остав- шиеся три файла содержат письма, касающиеся найма на работу. Пользователь некоторое время назад стал называть такие письма jobletterl, jobletter2 и т. д. С работой не клеилось: первые 795 попыток получить ее оказались неудачными. Поэтому он удалил эти файлы, и их имена уже не появляются в листинге. Он сох- ранил лишь письма с именами jobletter796 и jobietter797; хотя эти письма уже посланы, он еще ожидает ответа, поэтому пока хранит оригиналы для справок. Так как есть шанс, что и эти попытки получить работу будут неудачными, пользователь работает теперь над новым письмом jobletter798. Оно было создано ранее в теку- щем сеансе работы с UNIX. Вернемся к нашему примеру. После вывода имен файлов UNIX вновь выводит подсказку — знак доллара. Теперь поль- зователь может вводить следующую команду. Он набирает cat Jobletter798 Слово cat — это курьезное имя команды (Cat — кошка (англ.) — Перев.). Эта команда просто выводит на дисплей содержимое за- данного файла, в данном случае jobletter798. Этим действием пользователь напоминает себе, что хранится в файле. После вывода файла UNIX вновь выдает свою подсказку. Чтобы убедиться в безупречности письма, пользователь вызы- вает одну из программ UNIX, которая проверяет правильность
Гл. 1. Введение 15 написания слов. В отличие от cat эта команда имеет ясное имя: spell. Проверка на правильность написания слов в файле joblet- ter798 приводит к обнаружению одной ошибки: «знатак». Про- грамма не достаточно умна и не обнаруживает ошибку в слове «весьма», написанном как «ведьма», поскольку последнее слово существует. Если бы программа spell была исключительно умной программой — на переднем крае современных исследований,— она бы попыталась проанализировать значения слов; а если бы так, она обнаружила бы необычное использование слова «ведьма». Однако приведенная программа не такая ловкая; она проверяет каждое слово отдельно. Пользователь решает исправить свою орфографическую ошиб- ку посредством редактирования — т. е. изменения — своего фай- ла. Чтобы это сделать, он применяет программу-редактор ed к файлу jobletter798. В начале работы программа ed выводит число литер в файле, в данном случае 434. Затем пользователь набирает строку /знатак/ чтобы найти строку, содержащую слово знатак. (В книге мы объ- ясним программу-редактор позднее: сейчас постарайтесь пове- рить на слово в его «махинации». Одна из необычных особенно- стей редактора состоит в том, что он не выдает подсказок — пользователь просто набирает строки.) Приведенная выше строка заставляет редактор искать внутри файла слово знатак и вывести (первую) строку, которая содержит это слово. Поль- зователь затем исправляет свою ошибку, набирая магическую строку s/так/ток/р (В действительности это означает, что необходимо заменить так на ток и вывести результат.) Сделав изменение, пользователь вводит строки w и q, чтобы закончить редактирование — вновь подробно это будет объяснено позднее. Редактор выдает длину исправленного файла jobletter798. Эта длина на самом деле та же самая, как и до исправления, поскольку проведенное изме- нение не повлияло на длину файла. Затем UNIX вновь вы- водит подсказку (знак доллара) и пользователь может вводить команду. Вполне вероятно, что он теперь напечатает письмо на каком-либо печатающем устройстве, связанном с его ЭВМ; после этого он может положить письмо в конверт и отправить его по почте. В приложении А приводятся другие примеры сеансов работы с UNIX. Пока вы еще не сможете их все понять, однако беглый просмотр этих примеров, возможно, расскажет вам больше об особенностях системы UNIX.
16 Часть I. Идеи и концепции Команды и программы Связь с ЭВМ представляет исключительный интерес для пользо- вателя. Вам следует дружить с системой, которая может многое вам предложить. UNIX предлагает вам два средства. Первое — это отличная файловая система, которая, как гласит ее название, обеспечи- вает способ хранения систематизированной информации — это аналог обычной картотеки. Мы обсудим файловые системы в гл. 3 и 4. Второе — богатый набор программ, написанных специ- алистами и представленных в форме, готовой к использованию. Большинство программ — это встроенные системные программы, которые предоставляются во всех (или, быть может, почти во всех) реализациях UNIX. Этот набор системных программ может пополняться другими программами, разработанными для вашей конкретной ЭВМ. Возможно, вы сами будете писать программы, чтобы еще более расширить UNIX, хотя ваша первоначальная цель может заключаться только в использовании того, что есть, а не в расширении системы. Общество пользователей UNIX, которое охватывает весь мир,— это общество, которое делится и обменивается полезными программами и данными. В системе UNIX имеется 200 или около этого системных программ; они варьируются от простейших вспомогательных средств до всеобъемлющих пакетов. В приведенном выше примере использовались программы: • 1s — программа, выдающая список имен файлов; • cat — программа для вывода на дисплей содержимого файла; • spell — программа, проверяющая написание слов; • ed — редактор. Примеры других программ: • компилятор с языка Паскаль; • программа, позволяющая набирать математические формулы; • программа, обеспечивающая графический вывод; • обучающая программа, помогающая изучать систему UNIX; • программа для связи с пользователями на других ЭВМ. Как видите, программы настолько разнообразны, что было бы невероятно, чтобы один пользователь захотел воспользоваться всеми ими. Типичный пользователь имеет ограниченный круг интересов, скажем, занимается подготовкой документов и поэто- му стремится знать программы именно в этой области. Однако существует ядро из 20 (или около этого) системных программ UNIX, являющихся настолько фундаментальными, что каждый пользователь должен их знать. Например, каждый должен знать,
Гл. 1. Введение 17 как выводить файлы на дисплей и как копировать файлы. В книге сделан акцент как раз на эти основные программы, и если вы ими овладели и, естественно, овладели стилем UNIX, то вы легко овладеете и более специализированными программами для вашей конкретной области деятельности. В приложении В приводится список команд UNIX, которым можно воспользоваться для бег- лого знакомства или для справок. Вы выбираете программу, которую хотите использовать, да- вая команду системе UNIX. Само слово «команда» создает впе- чатление, что это вы приказываете, a UNIX будет делать в точ- ности то, что вы хотите от нее. Мы полагаем, что в конце концов так и будет, но, как вы, вероятно, знаете, начинающие имеют обыкновение делать ошибки, что заставляет ЭВМ выступать в качестве непокорного зверя. Поэтому, если вы мысленно замените слово «команда» на «пробный запрос», то это может оказаться более соответствующим действительности. Когда вы используете программу, говорят, что вы ее выпол- няете. В приведенном примере мы выполняли программы 1s, cat, spell и ed. Программу, которая помогает достигнуть некото- рую большую цель, часто называют средством. Так, о программе spell можно сказать, что это средство для писателей. Подготовка документов В системе UNIX применяют нейтральный термин документ для обозначения любого текстового материала. Документом может быть короткое приглашение на вечеринку, письмо, стихотворение, отчет, список фамилий и адресов или двадцатитомное сочинение. Обычно документы хранятся в файлах, как это мы видели в приме- ре с файлами jobletter. Система UNIX располагает большим числом средств для подготовки документов. Подготовка документов пе- ресекается с обработкой текстов, и действительно некоторые люди используют эти два термина как синонимы. В UNIX делается упор на обеспечение общего набора средств, которые можно применять к документам любого вида и размера и которые покры- вают все стадии подготовки документов от начального ввода до получения конечного продукта для наборного устройства и (или) печати. Системы обработки текстов часто более специализирова- ны и могут быть, в частности, связаны с определенным набором задач, выполняемых в учреждениях. Эти специализированные системы мощнее, чем ориентированные на них задачи, и часто очень просты в изучении, но они, как правило, уступают гибким и многосторонним средствам UNIX. Хотя интересы пользователей UNIX различны, подготовкой документов занимаются все. Для писателя подготовка докумен- та — это конечная цель его деятельности. Для программиста —
18 Часть 1. Идеи и концепции это средство, с помощью которого он может объяснить свои про- граммы потенциальным пользователям; программы без документа- ции бесполезны, В книге мы будем часто приводить примеры, связанные с подготовкой документов, поскольку тогда каждый читатель смо- жет в этих примерах разобраться. Однако мы не считаем, что читатель интересуется исключительно этой областью. Оперативная документация Так как система UNIX является хорошим средством для подготов- ки документов, она была использована для создания своей соб- ственной документации. Более того, эта документация может быть выведена на дисплей любого пользователя. Так, если вам необхо- дима информация о конкретном средстве системы UNIX, вы обычно не ищете ее в печатном документе. Вместо этого вы про- сите саму систему UNIX вывести на ваш терминал соответствую- щую страницу из документации системы. Документация UNIX собрана в массивный многотомник, на- зываемый Руководство для программиста системы UNIX. По первому тому этого руководства, в котором описаны все команды UNIX, можно получить консультацию в диалоговом режиме в большинстве реализаций UNIX В этом случае существует только одна трудность — материал излагается сжато и не предназна- чен для начинающих. Поэтому истинное назначение книги, подоб- ной нашей, дать читателям основу, на базе которой они смогут понять Руководство для программиста системы UNIX; поняв его, они могут выбросить книгу. Язык программирования С Система UNIX была написана на языке программирования, на- зываемом языком С. Язык С был разработан для UNIX, и разви- тие языка С шло рука об руку с развитием системы UNIX. Если подобно большинству пользователей UNIX вы желаете остаться любителем, то вам нет необходимости знать что-либо об языке С. Если, с другой стороны, вы стремитесь стать профессионалом, то вам необходимо изучить язык С. Это даст вам возможность изме- нять и адаптировать вашу локальную систему UNIX и писать системные программы. Это также позволит вам использовать неко- торые весьма специализированные средства системного програм- мирования. В гл. 12 мы дадим краткое введение в язык С и снаб- дим дальнейшими ссылками на литературу тех, кто этим интере- суется.
Гл. 1. Введение 19 История Операционные системы обычно пишут для того, чтобы удовлетво- рить требованиям абстрактного «типового заказчика», определяе- мого специалистом по сбыту товаров. Одна из основных причин успеха UNIX, как ни парадоксально, заключалась в том, что в разработку этой системы не был вовлечен специалист по сбыту. Работы над системой UNIX были начаты в 1969 г. Кеном Томп- соном, сотрудником научно-исследовательской лаборатории по информатике фирмы Bell Laboratories, расположенной в г. Мар- ри-Хилл, штат Нью-Джерси. В задачу Кена Томпсона входило написать операционную систему для себя, а не для каких-либо абстрактных пользователей, и поэтому он имел прекрасное пред- ставление о нуждах заказчика. Лаборатория в Марри-Хилл располагала и еще располагает одной из наиболее талантливых в мире групп исследователей в области информатики. Эта группа, безусловно, входит в пятерку сильнейших в мире, а в некоторых областях даже близко подхо- дит к группе из Кентского университета г. Кентербери. Многообещающая работа Томпсона привлекла внимание некоторых талантливых специалистов из прославленного коллек- тива, и за несколько лет большое число выдающихся людей внесли свой вклад в разработку UNIX. Вклад одного из них, Дениса Ритчи, особенно велик — он расширил горизонты UNIX. Резуль- татом совместного труда Ритчи и Томпсона явилась увидевшая свет и получившая приз статья в журнале Communications of the ACM (1974 г. и переизданная в январе 1983 г. в юбилейном выпуске). Эта статья служит вдобавок прекрасным образцом чет- кости и краткости изложения материала. Подтверждением тому является то, что принципы, заложенные в UNIX, актуальны до сих пор. Другие специалисты Bell Laboratories сделали UNIX еще более привлекательной, снабдив ее мобильностью (т. е. способ- ностью работать на различных ЭВМ) и написав программы, которые намного расширили ее возможности. Чем меньше, тем лучше Одно из достижений UNIX состояло в том, что к работе над ней удалось привлечь талантливых специалистов. Многие прош- лые проекты, в которых участвовали армии умных людей, закон- чились абсолютным провалом. Существуют две опасности. Во-пер- вых, умные специалисты создают нечто такое, что никто другой понять не может. Во-вторых, с ростом численности группы разра- ботчиков экспоненциально растет проблема управления, но даже одним умным специалистом обычно труднее управлять, чем двумя,
20 Часть I. Идеи и концепции менее талантливыми. UNIX привлекла талантливых специалистов благодаря использованию принципа «чем меньше, тем лучше». Система строится из относительно небольших компонент; мощь системы — в объединении этих отдельных частей. Компоненты создавались небольшими группами, часто одним или двумя спе- циалистами. Если компонента небольшая, то маловероятно, что- бы она оказалась слишком сложной для понимания простыми смертными. Результатом вовлечения талантов в создание системы UNIX и в особенности использования принципа «чем меньше, тем лучше» явилось то, что UNIX стала в настоящее время одной из наибо- лее широко используемых операционных систем. Ее популярность не есть результат деятельности специалистов по сбыту товаров, телевизионной рекламы или меценатов, а объясняется просто тем, что UNIX — хорошая система. Пользователи UNIX составляют в настоящее время удиви- тельно широкий круг людей: он включает писателей, бизнесме- нов, исследователей, ученых и — последних по счету, но не по значению — тех, кто использует ЭВМ только для удовольствия, которое она доставляет.
ГЛАВА 2 РАЗДЕЛЕНИЕ ЭВМ МЕЖДУ ПОЛЬЗОВАТЕЛЯМИ Разделяемая UNIX —это удвоенная UNIX. Старинная пословица UNIX—многопользовательская операционная система. Это оз- начает, что вы разделяете ЭВМ (работаете совместно) с другими пользователями, которые работают на ЭВМ одновременно с вами. Каждый пользователь работает за отдельным терминалом, по крайней мере будем надеяться, что это так — ибо в противо- положном случае у вас действительно есть трудности. Каждый пользователь ведет независимый диалог с ЭВМ. Эта ситуация в точности напоминает сеанс одновременной игры в шахматы одного гроссмейстера с двадцатью игроками. На некоторых ЭВМ гросс- мейстер UNIX может иметь дело более чем с двадцатью пользова- телями одновременно; на супер-ЭВМ это число может превышать даже сотню. Эти пользователи могут находиться в одном и том же здании или при использовании современных систем связи, могут быть рассредоточены по всему свету. Однако большинство систем UNIX значительно более скром- ные: на самом деле следовало бы сказать, что UNIX — потенци- ально многопользовательская система, так как вполне возможно,
22 Часть I. Идеи и концепции что ваша система рассчитана только на одного пользователя. ЭВМ, которая допускает работу только одного пользователя в каждый момент времени, называется однопользовательской си- стемой (хотя на ней могут работать в разное время несколько различных пользователей). Даже если ваша система однопользо- вательская, мы советуем вам прочитать эту главу и вы вскоре поймете почему. Главное достоинство многопользовательской системы состоит, естественно, в том, что стоимость аппаратных средств можно разделить. Второе достоинство более удивительное. Ваша первая реакция на идею разделения ЭВМ между вами и другими поль- зователями может быть такой же, как реакция на идею разделе- ния ваших друзей или подруг; однако, когда люди разделяют ЭВМ (здесь и далее в этой главе слово «разделяют» означает «исполь- зуют одновременно»), они могут взаимодействовать друг с другом, посылая сообщения через ЭВМ, и могут объединяться в группы для достижения большего, чем может сделать отдельный поль- зователь. Даже если вас не убедили эти аргументы и пугают нецивили- зованные массы, которые могут работать одновременно с вами на ЭВМ, вы должны оценить третье достоинство многопользова- тельских систем типа UNIX: вы можете разделить ЭВМ с самым цивилизованным и разумным человеком, которого вы знаете,— с самим собой. Это делается следующим образом. Если вы задаете ЭВМ задачу, на решение которой потребуется какое-то время, UNIX дает вам возможность поработать в это время с другой задачей, вместо того чтобы сидеть и бить баклу- ши. В этом случае ваши две, а если хотите и более, отдельные задачи разделяют ЭВМ точно таким же образом, как если бы она разделялась отдельными пользователями. Разница лишь в том, что задачи, принадлежащие одному и тому же пользователю, связаны с одним терминалом, в то время как задачи, принадлежа- щие разным пользователям, обычно связаны с различными терми- налами. (Поэтому мы вам советовали, чтобы владельцы однополь- зовательских систем UNIX прочитали эту главу.) Термин задача в действительности жаргонное слово в вычис- лительной технике и используется для обозначения программы, выполняющейся на ЭВМ. Термин процесс является синонимом сло- ву «задача», и, поскольку этому термину отдается предпочтение в документации по системе UNIX, мы также будем его использо- вать. Как работают операционные системы На тему о том, как работают операционные системы и как они одновременно обслуживают большое число пользователей, напи- саны большие и увесистые книги. Вам как пользователю UNIX
Гл. 2. Разделение ЭВМ между пользователями 23 нет необходимости знать о принципах работы операционных си- стем больше, чем водителю автомобиля о принципах работы дви- гателя внутреннего сгорания. Однако, когда вы используете UNIX, знание принципов помогает понять, что происходит внут- ри системы, точно так же, как это помогает при использовании автомобиля, и мы дадим здесь сильно упрощенное изложение принципов работы операционных систем. (На самом деле наше чрезмерно упрощенное определение слова «процесс» уже будет нарушением учения об операционных системах.) Тем не менее, если вы находите наше толкование трудным, можете спокойно пропустить этот и следующий за ним разделы. С другой стороны, если вы вдохновитесь на более глубокое изучение операционных систем, то я рекомендую вам хорошую сравнительно небольшую книгу Листера (Lister, 1979) Небольшая по объему книга Уилкса (Wilkes, 1972) также посвящена многопользовательским систе- мам; это сравнительно старая, но до сих пор хорошая книга. Третья большая и более поздняя книга — Дейтела (Deitel, 1983). Как ЭВМ обслуживает несколько одновременно работающих пользователей? Удивительно, что, когда вы впервые работаете с UNIX, вы, ве- роятно, даже не знаете обо всех других пользователях, которые разделяют с вами ЭВМ, если, конечно, они не сидят за соседними терминалами и вы их можете видеть воочию. Эффект такой, как будто ЭВМ полностью в вашем распоряжении. Возможно, подоб- ным же образом шахматисты, одновременно играющие с гроссмей- стером, видят каждый свой мир сквозь призму игры между собой и гроссмейстером. Только в том случае, если ЭВМ пере- гружена, т. е. на ней одновременно работает слишком много для ее мощности пользователей, становится чрезмерно большим время ответа. (Время ответа — это время, прошедшее от момента ввода какого-либо сообщения в ЭВМ до получения от нее ответа.) Иногда не столь велико число пользователей, загружающих ЭВМ, сколь велика жадность на процессорное время некоторых пользователей. Чтобы объяснить, как UNIX старается угодить нескольким одновременно работающим пользователям, мы перейдем от ана- логии с гроссмейстером к аналогии с жонглером. Жонглер произ- водит большее впечатление скоростью действий и быстротой реак- ции. Он подбрасывает вверх шар и затем в течение одной-двух секунд может заниматься другими шарами, пока первый шар не упадет, и его надо будет снова подбросить. Аналогичным образом UNIX делит свое время на небольшие временные кванты (интервалы). Размер временного кванта колеб- лется в различных реализациях UNIX; его величина может
24 Часть I. Идеи и концепции составлять, например, одну секунду. UNIX выполняет один про- цесс в течение временного кванта, а затем приостанавливает этот процесс и переключается на другой. Этот второй процесс выполняется в течение одного временного кванта, а затем UNIX переключается на третий процесс. По прошествии нескольких вре- менных квантов вновь подходит очередь первого процесса, и он будет возобновлен с того места, где был приостановлен. Алго- ритм внутри операционной системы, в соответствии с которым выбирается для выполнения очередной процесс, называется алгоритмом планирования. Простейший алгоритм планирова- ния — циклический, при котором каждая задача выбирается строго по очереди. Этот алгоритм в точности напоминает работу жонглера — если только жонглер не исполнит сенсационный трюк, при котором один шар обгонит другой. Алгоритмам плани- рования были посвящены годы исследований. Были изобретены алгоритмы, значительно более сложные, чем циклический алго- ритм. Современные алгоритмы планирования часто пытаются на- казывать алчных пользователей путем сокращения их доли. Большинство реализаций UNIX пытается наказывать алчных пользователей и минимизировать время ответа. Тем не менее, если на ЭВМ работает двенадцать пользователей и каждый одновременно запустит процесс, требующий пяти ми- нут на проведение вычислений, даже наиумнейший алгоритм пла- нирования не сможет сократить временной промежуток длитель- ностью в один час до момента завершения последнего процесса. В действительности это время будет больше часа, поскольку си- стеме потребуется дополнительное время на переключение между процессами. Таким образом, ЭВМ будет решать задачу пользова- теля по крайней мере в двенадцать раз медленнее, чем если бы он был единственным пользователем. (В книге принято соглашение, что пользователи — это мужчины, а суперпользователь — персо- наж, который еще появится,— женщина. Хотя кажется невоз- можным ввести какое-либо соглашение, которое было бы для всех хорошим и никого не обидело, мы надеемся, что это соглашение по крайней мере предотвратит марши протеста, направленные в сторону Кентербери.) Хотя мы только что сослались на случай, в котором процесс выполняется в двенадцать раз медленнее, чем он мог бы выпол- няться, мы настаиваем на нашем утверждении, что в большинстве случаев одному пользователю не доставляют беспокойства другие пользователи. Это объясняется тем, что чрезвычайно редко про- цессы всех пользователей выполняются в одно и то же время. Для этого есть две причины. Первая — просто житейское наблюдение. Если вы сделаете моментальный снимок системы UNIX, обслуживающей дюжину пользователей, то увидите, что шесть из них думают, трое наби-
Гл. 2. Разделение ЭВМ между пользователями 25 рают входные данные, а трое других ожидают, пока выполняется их процесс. (Мы предполагаем, что люди в комнате пытаются сделать что-либо полезное и работают независимо. Если бы все они играли в игру с космическими ракетами, расклад был бы иной.) Даже самая быстропечатающая машинистка работает медленно по сравнению со скоростью работы ЭВМ, поэтому три наших поль- зователя, набирающие что-то на клавиатуре, не представляют ка- кую-либо значительную нагрузку для ЭВМ. Очевидно, что шесть думающих пользователей также не загружают ЭВМ, поэтому остаются три пользователя, процессы которых выполняются. Мы предположим, что из этих троих один выполняет простую интерактивную работу, например редактирование. Пользователь набрал команду редактирования, и ЭВМ должна ее выполнить. Обычно это не требует больших вычислительных ресурсов — при удачном стечении обстоятельств процесс может завершиться в течение одного временного кванта, так что в этом случае опять не требуется больших затрат ресурсов от ЭВМ. На самом деле во многих случаях процесс сам завершает свой временной квант еще до того, как он истек. Предположим, что второй пользователь выполняет некоторую операцию с файлом. Обычно файлы хранятся на запоминающем устройстве ЭВМ, называемом диском. Процесс второго пользова- теля расходует несколько временных квантов, а затем требует ввести новые данные из файла. Ввод из файла хотя и быстрее, чем ввод с терминала, но все же еще медленный по стандартам ЭВМ. Для того чтобы серийная ЭВМ не простаивала, проклиная низ- кую скорость своего файлового ввода и прикидывая, что она смогла бы за время ожидания проверить правописание всех слов в романе «Война и мир», большинство ЭВМ снабжены инструкцией вида: «запусти эту файловую операцию и сообщи мне, когда она закончится». Пока продолжается медленная работа с файлом, ЭВМ переключается на другую работу. В частности, она может выделить временной квант для нашего третьего пользователя. У третьего пользователя имеется программа, которая вычис- ляет в течение двух часов, а затем выводит одно число, являю- щееся результатом всех ее трудов. (Когда выполнение програм- мы завершается, пользователь делает в ней наобум изменения и вновь ее запускает на пару часов. Случайно этот пользователь оказался физиком.) Процесс этого пользователя использует все временные кванты, которые предоставляет ему алгоритм плани- рования . Пауза наступает только в момент вывода строки на тер- минал. Вывод на терминал чрезвычайно медленный, даже по срав- нению с вводом данных из файлов, и дает шанс другим пользова- телям получить несколько временных квантов. Даже в том слу- чае, когда этот процесс не выполняет ввода-вывода и поэтому выпрашивает все временные кванты, какие только может полу-
26 Часть 1. Идеи и концепции чить, хороший алгоритм планирования должен гарантировать, что другие пользователи получат свою законную долю за счет предоставления им приоритета по отношению к алчному процессу. Подводя итог, отметим, что операционная система может об- служивать большое число пользователей, так как: • в любой момент времени большинство пользователей думают или набирают входные данные; • большинство процессов периодически делают паузы для вы- полнения операций ввода-вывода; • хороший алгоритм планирования держит алчных пользовате- лей под контролем; • некоторые процессы, особенно передача данных в файл или из файла, могут выполняться как фоновые, пока ЭВМ занята другими процессами. На последнем пункте можно остановиться подробнее. В об- щем случае вычислительная система может быть построена из не- скольких ЭВМ, каждая из которых может одновременно выпол- нять различные задачи. Такой режим работы называется муль- типроцессорной обработкой. Однако UNIX создает у своих пользователей впечатление, что они общаются с единственным существом, поэтому вам не приходится беспокоиться о таких де- талях. Защита и суперпользователь Разделение ЭВМ с другими пользователями было бы не очень при- ятным, если бы ваши «друзья» могли изменять ваши файлы или влиять на ваши процессы. Чтобы этому воспрепятствовать, в си- стеме UNIX имеется несколько правил защиты и механизмов, которые гарантируют их соблюдение Большинство законов (правил), по которым мы живем, уста- навливаются правительствами. Наиболее частой формой прав- ления является диктатура. Система UNIX также относится к диктатурам.. В этой системе есть один пользователь, который устанавливает правила, по которым живут остальные пользова- тели, и который контролирует соблюдение этих правил. Дикта- тора зовут суперпользователем. Суперпользователь контролирует, можете ли вы использовать ЭВМ, сколько памяти могут занимать ваши файлы, какие файлы вы можете изменить и даже какие команды UNIX вы можете использовать. Она (в соответствии с нашим соглашением, что суперпользователем является женщи- на) не навязывает свою волю грубой силой. Вы не найдете гроз- ную фигуру, сердито присматривающую за вами во время работы за терминалом. Напротив, мощь суперпользователя заключается
Г1П. 2. Разделение ЭВМ между пользователями 27 в управлении посредством некоторых механизмов, реализован- ных в самой системе UNIX. Вы можете даже не знать, кто она. Обычно суперпользователь делает вас счастливым; она вы- полняет массу неблагодарных закулисных работ, чтобы исполь- зование UNIX доставляло вам удовольствие. Если бы диктатура суперпользователя была заменена анархией, то система UNIX вскоре потерпела бы крах. Вход в систему Как только вы попытаетесь использовать UNIX, вы сразу же осознаете мощь суперпользователя. Она контролирует, кто может использовать систему UNIX, которой она управляет. Каждый пользователь должен иметь входное (регистрационное) имя, ко- торое назначает суперпользователь (или ее агент). Обычно вход- ное имя образуется из инициалов или фамилии пользователя. Входные имена должны быть уникальными, поэтому если в вашей системе уже есть пользователь peter, то вы не можете также ис- пользовать имя peter. Слово «вход» происходит от жаргонного машинного термина. Всякий раз, когда вы пользуетесь многопользовательской опера- ционной системой, вы должны прежде всего известить о себе ЭВМ. Это и называется входом в систему. Войдя в систему, вы можете затем пользоваться ею до тех пор, пока не распрощаетесь с ней путем выхода из системы. Период времени, который вы провели, работая в системе, называется сеансом. При соответст- вующем разрешении суперпользователя сеанс может продолжать- ся от нескольких секунд до нескольких часов. Кроме того, вы можете провести несколько сеансов в день. Бывают ограничения на число пользователей, которые мо- гут одновременно войти в систему, т. е. одновременно использо- вать ЭВМ. Очевидно, что поскольку за каждым терминалом в данный момент времени может работать только один пользова- тель, то физическим пределом для числа одновременно работаю- щих пользователей является число терминалов, которые могут быть связаны с системой UNIX, но иногда суперпользователь устанавливает фактическое ограничение ниже этого. В персональ- ных системах UNIX может быть только один терминал и поэтому один (в один момент времени) пользователь. Небольшая распре- деленная система UNIX может иметь ограничение до двенад- цати пользователей. Общее число пользователей системы может составлять несколько сотен, так как данное ограничение отно- сится только к числу людей, входящих в систему одновременно. Чтобы защититься от самозванцев, с каждым входным именем в системе UNIX связан секретный пароль. Всякий раз, когда вы входите в систему, необходимо набрать свое входное имя и
28 Часть I. Идеи и концепции пароль. Обычно любая литера, которую вы вводите с клавиатуры терминала, появляется на экране. Этого, однако, не происходит при вводе пароля, поскольку, если бы пароль появился на экра- не, его главное свойство — секретность — было бы утрачено; поэтому UNIX подавляет вывод пароля на экран дисплея. Все же остерегайтесь того, кто наблюдает за вашими пальцами, когда вы набираете свой пароль. В гл. 6, когда мы начнем знакомить вас подробно с работой в UNIX, мы приведем пример входа в систему. Пароль — это нечто, что находится под вашим управлением; после входа в систему вы можете изменить его на любой другой, который пожелаете. Не старайтесь быть слишком умным. Наи- более неприятная ситуация — забыть собственный пароль и в связи с этим пресмыкаться перед суперпользователем (полагаем, что вы знаете, кто она) и просить ее дать вам новый пароль. Определение пароля другого пользователя Во всем мире человеческая изобретательность направлена на по- лучение паролей других пользователей. Первый подход в этом направлении связан с психологией. Большое число людей выбирают в качестве своего пароля имя, ко- торое им более всего нравится: имя подруги или друга, спортив- ной команды или, возможно, свое собственное. Поразительно, как часто предположение в этом направлении оправдывается. Второй подход, открытый для программистов, состоит в напи- сании хитрых программ, которые обманывают непосвященного. Особенно прост и привлекателен следующий прием. Вы пишете программу, которая выводит на терминал точно такое же пригла- шение, которое выдает UNIX перед входом пользователя в систе- му Затем вы оставляете программу в этой стадии и покидаете терминал. Спустя некоторое время появляется ваша жертва. Пользователь выполняет обычную процедуру входа, вводя свое входное имя и пароль. Ваша программа записывает их в файл, выводя пользователю сообщение типа «неверный пароль», и вы- ходит из системы. Затем появляется действительное приглашение для входа в UNIX. Ваша жертва думает, что пароль и в самом деле был набран с ошибкой, когда пользователь делает вторую попытку, все проходит нормально, поэтому он больше об этом не думает. Позднее вы входите в систему и проверяете файл, который создала ваша тайная программа, и вот вам пароль другого поль- зователя. Если вы действительно удачливы, то обхитрите и су- перпользователя. Если вы получите пароль суперпользователя, все возможности системы в ваших руках. Вы входите в систему как суперпользователь, изменяете пароль суперпользователя, и бескровный переворот совершен. Входное имя суперпользова-
Гл. 2. Разделение ЭВМ между пользователями 29 теля, между прочим, не такое яркое, как Наполеон или Тэтчер, а просто root. Позднее мы увидим, почему оно выбрано таким. Если вы не программист, то вы можете не понять приведенный выше пример. Несмотря на это, если вы работаете в коллективе, где люди находят удовольствие в том, чтобы сыграть друг с другом шутку, этот пример послужит для вас просто предупреждением, что нужно быть бдительным. Защита процессов друг от друга Хотя UNIX может выполнять несколько процессов одновременно, вы можете с уверенностью считать, что процессы других пользо- вателей не влияют на выполнение ваших процессов. Например, если кто-либо еще использует программу spell в то же время, что и вы, не стоит опасаться, что его ошибки правописания будут перемешаны с вашими. Вы сможете, если станете опытным пользователем UNIX, умышленно создать два собственных различных процесса, взаимо- действующих друг с другом. Однако такие вопросы лежат вне сферы данной вводной книги. Важно помнить, что при начальном знакомстве с UNIX вам не нужно использовать такие средства, а поэтому вы можете спать спокойно. Защита файлов Хотя ваши процессы защищены от вмешательства других пользо- вателей, данные, которые вы храните в своих файлах, могут быть не защищены. На самом деле, если вы работаете в группе, вы можете быть вполне довольны тем, что другие члены группы из- меняют ваши файлы. Например, пользователь, рассмотренный в гл. 1, может быть даже признателен своим друзьям, пытающимся изменить и улучшить файлы jobletter. Однако обычно вы хотите защитить файлы, и UNIX предоставляет средства для этого. Естественно, это не защищает вас от всеобъемлющей мощи супер- пользователя — особы, которая может изменить или уничтожить все, что захочет. Учет Система UNIX, подобно любой другой многопользовательской системе, может хранить записи о том, сколько вычислительных ресурсов использовал каждый пользователь. Эти ресурсы вклю- чают пространство, занимаемое файлами, процессорное время и время связи (т. е. время, в течение которого вы находились в си- стеме UNIX независимо от того, делали ли вы в ней что-либо или просто думали).
30 Часть I. Идеи и концепции В некоторых системах UNIX пользователи платят деньги за ресурсы, которые они используют, и для расчета оплаты слу- жит машинная учетная информация. Если вам повезло работать с системой UNIX бесплатно, учетная информация все же полезна для управления системой. Это связано с тем феноменом, что если вычислительные ресурсы свободно доступны и удобны для ис- пользования (каке UNIX), то пользователи быстро расхватывают их. Так область под файлы, какой бы она ни была большой, вскоре исчерпывается; подобным образом вычислительная мощ- ность, как бы она ни была велика, имеет предел, по достижении которого время ответа становится слишком большим, и новые пользователи вынуждены покидать систему. В связи с этим обстоятельством должно быть твердое руковод- ство для наказания алчности и защиты неэгоистичных пользова- телей, подобных вам. Это осуществляется суперпользователем и, в реальном времени алгоритмом планирования на основе учет- ной информации, которую собирает система UNIX. Электронная почта Если вычислительная система обслуживает изрядное число поль- зователей, у них возникает желание пообщаться друг с другом. Чтобы облегчить общение, UNIX поддерживает систему электрон- ной почты, через которую пользователи могут посылать сообще- ния друг другу. Сообщения, посылаемые пользователю, который в данный момент не работает в системе, сохраняются до тех пор, пока он не войдет в систему; войдя в систему, пользователь мо- жет вывести на дисплей свою почту. Часто первым сообщением, которое UNIX выдает на дисплей после входа в систему, слу- жит сообщение «вам почта». В некоторых очень больших вычислительных центрах, ис- пользующих UNIX и поддерживающих большие и разнообразные группы пользователей, электронная почта стала предпочтитель- ным методом общения по сравнению с записками и телефонными звонками. Действительно, термин «почта» становится обозначе- нием скорее электронной, чем обычной почты (условность, кото- рая будет принята в этой книге). Некоторые пользователи UNIX входят в систему один-два раза в день только для того, чтобы прочитать свою почту. Характер посылаемых сообщений, очевидно, зависит от об- щества пользователей. На некоторых ЭВМ процветают группы, имеющие определенные интересы, которые используют UNIX для обмена информацией, скажем, о винах. На других почта в основном касается административных дел или наличия и исполь- зования информации («Мой адресный список теперь обновлен с учетом ваших предложений», «У вас восемь копий подобной информации, уничтожьте лишние»).
ГЛАВА 3 ФАЙЛЫ Я знаю, что положил это в надежное место, но теперь не могу вспомнить в какое именно. Вся ваша информация, хранящаяся в ЭВМ, размещается в фай- лах. Слово «файл» (file) на самом деле выбрано не очень удачно. На английском языке оно обозначает архивную папку с подшиты- ми в нее документами. Такие папки могут содержать большое число отдельных документов: писем, счетов, отчетов и т п. Начиная работать с файлами в UNIX, не пытайтесь хранить в одном и том же файле разнородные данные, например письма и накладные. Наоборот, если данные по своей природе различны, создайте для них отдельные файлы. Позднее, когда появится на- вык управления данными, всегда можно объединить файлы. Все это не означает, что в UNIX нельзя создавать больших файлов; файлы могут содержать до 10е литер, и поэтому отдель- ный файл может содержать адресный список, насчитывающий миллионы имен и адресов. Тем не менее в соответствии с принятым в UNIX подходом «чем меньше, тем лучше» часто лучше разби-
32 Часть I. Идеи и концепции вать большие файлы на ряд меньших файлов, особенно если вы собираетесь работать с каждой частью отдельно. Так, длинный отчет целесообразно разделить на отдельные главы, каждая из которых помещается в свой собственный файл. Любая информация, которую вы желаете сохранить от одного сеанса работы с UNIX до другого, должна храниться в файлах. (Можно использовать также «временные» файлы, которые не сохраняются по окончании сеанса работы.) Даже пользователи со скромными запросами спустя короткое время создают десятки, а возможно, и сотни файлов. В действительности пользователи UNIX, как правило, создают больше файлов, чем пользователи других операционных систем. Одна из причин этого — философия «чем меньше, тем лучше». Вторая причина состоит в том, что, так как система UNIX располагает большим количеством прек- расных возможностей, пользователи используют ее для многих других целей, помимо тех, что предполагались вначале. Напри- мер, если вы используете UNIX в основном для разработки программ на Паскале, то она послужит вам также для документи- рования программ, а возможно, — для сохранения записей о модификациях и получения статистической информации о выпол- нении. Не будем сейчас касаться вопроса о том, как в действитель- ности хранятся файлы. Все, что вам необходимо знать,— это то, что в UNIX имеется файловая система, которая заботится обо всех ваших файлах. Ваша единственная задача — выбрать имя файла, по которому вы будете узнавать созданный вами файл. В качестве имени файла UNIX разрешает использовать любую последовательность литер, но мы будем использовать последова- тельности из букв и/или цифр (кроме расширений, см. далее) и рекомендуем вам поступать так же. В гл. 1 мы познакомились с шестью примерами имен файлов. Приведем еще несколько имен файлов: mailinglist, t, divislon2. Двоичные и текстовые файлы Большинство файлов содержит документы. Под словом «доку- мент» мы понимаем любую информацию, представленную после- довательностью литер. Так, документом может быть что угодно, начиная с лирического стихотворения и кончая текстом програм- мы. Файлы, содержащие документы, называются текстовыми файлами. Естественно, система UNIX не знает, что представляет собой файл и ей безразлично его содержимое. Если смотреть на файл со стороны, то можно восторгаться его художественными достоинствами как стихотворения или восхищаться его изя- ществом как программы, но внутри ЭВМ все файлы представляют собой последовательности литер. Конец строки отмечается спе-
Гл. 3. Файлы 33 циальной литерой «новая строка», которая обрабатывается систе- мой аналогично другим литерам. Так прекрасное лирическое стихотворение: I adore you even more than Southampton’s superb Football Clerb.1’ представляется последовательностью литер «I», пробел, «а», «d», «о», «г», «е», новая строка, «у», «о», «и», пробел, . . . Кроме таких текстовых файлов, UNIX поддерживает двоич- ные файлы. Если вы не программист, вам не интересно, как они создаются, но по крайней мере следует знать, что они собой пред- ставляют. Если вы не очень поумнели, прочитав эту главу, то не слишком расстраивайтесь— можете вновь вернуться к ней после того, как приобретете побольше опыта. Возможно, вы знаете, даже если вы и не программист, что программы часто преобразуются из текстовой (или исходной) формы в последовательность отдельных битов, которые могут непосредственно выполняться ЭВМ. Удобно запомнить такую двоичную форму программы в файловой системе наряду с исход- ной формой программы. В этом случае не требуется ретрансли- ровать программу в двоичную форму при каждом новом ее ис- пользовании. При работе с системными программами UNIX, например 1s, вы пользуетесь непосредственно их двоичной фор- мой . Некоторые программы поставляются только в двоичной форме, так как их исходный вид разработчики хотят сохранить в секрете (иногда по коммерческим соображениям, иногда из-за стыда). Кроме того, общепринято определенные данные хранить в двоич- ном виде. Так, языки высокого уровня, такие как Паскаль, позволяют читать и писать данные, представленные в двоичном виде. Даже в текстовых файлах, хотя мы и заявили, что они пред- ставляются в виде последовательности литер, каждая литера на самом деле хранится в виде числового кода. Числовые коды определяются некоторой системой кодирования. Существует большое число различных стандартных систем кодирования (если в этом нет явного противоречия — говорить о различных стандар- тах), из которых наиболее популярен ASCII (американский стандартный код для обмена информацией). Другой, также попу- лярный код Международной организации по стандартизации (ISO) очень близок к ASCII. Каждая литера запоминается в виде 11 11 Я поклоняюсь тебе даже более, чем прекрасному футбольному клубу из Саутгемптона. 2 № 161
34 Часть 1. Идеи и концепции байта, состоящего из 8 бит. В этой книге нам, конечно, не пред- ставляет интереса обсуждать отдельные биты — на самом деле некоторые читатели даже могут и не знать, что из себя пред- ставляет бит. Вполне достаточно иметь представление о байте как о десятичном числе, лежащем в диапазоне от 0 до 255. Если представить в коде ASCII первую строку нашего стихотворения (I adore. . .), то оно будет записано в виде последовательности байтов: 73 32 97 100 111 114 101 Не удивительно, что UNIX часто раздражается и сердится, встре- чая романс в виде серии чисел. Одним из наиболее полезных свойств UNIX является то, что все файлы обрабатываются одинаково. Это одна из многих харак- терных черт UNIX, которые вы сможете по-настоящему оценить только после того, как поработаете с другой операционной си- стемой, в которой для обработки различных типов файлов тре- буются различные команды. Для UNIX каждый файл — это про- сто последовательность байтов, и вы можете, например, исполь- зовать одну и ту же команду для копирования файла независимо от того, что содержит файл — стихотворение или программу, и независимо от того, какой это файл — текстовый или двоичный. Как мы вскоре увидим, эта свобода делать с любым файлом все, что вам нравится, имеет и отрицательную сторону: вы можете свободно делать не только разумные вещи, но и глупости. К счастью, для большинства пользователей им нет необходимо- сти иметь дело с системами кодирования и байтами. Однако неко- торые специфические особенности вашей ЭВМ могут стать яснее, если вы поймете, что даже текстовые файлы в действительности закодированы внутри ЭВМ в виде цифр. Когда система UNIX вы- водит файл на дисплей, она преобразует числа обратно в тексто- вую форму, используя систему кодирования в обратном направ- лении. В результате этого внутренние коды выводятся на дисплей, как вы и ожидаете, в текстовом виде. Так как вы свободны делать все что вам нравится с любым файлом, вы можете попытаться декодировать и вывести на дисплей не текстовый, а двоичный файл. Другими словами, вы можете попытаться преобразовать в текст некоторые байты, которые вовсе не представляют собой текстовые литеры. Результатом этого будет, очевидно, случайная последовательность литер. (Литеры случайно могут образовать правильную последовательность слов, но шансы получить полное собрание сочинений Шекспира невелики.) Получить случайную последовательность литер не очень страшно, но «фейерверк» на- чинается тогда, когда оказывается, что один из текстовых кодов, которые вы пытаетесь вывести на дисплей, соответствует коду, ме-
Гл. 3. Файлы 35 няющему режим работы вашего терминала. Такие коды могут вы- звать очистку экрана, смену изображения на негативное или выдачу звукового сигнала. Если повезет, то вы сразу сможете получить озвученное изображение. Физические устройства Одна из наиболее ценных услуг, предоставляемых системой UNIX, заключается в том, что она скрывает от своих пользователей лабиринты физических устройств, на которых запоминаются файлы. В этом разделе мы приведем некоторые примеры этой не- видимой полезной работы, которую выполняет UNIX. Ваши файлы будут, вероятно, храниться на таких устройствах, как диски и ленты. Эти физические устройства имеют ряд не- приятных ограничений. Как правило, файлы должны быть раз- биты на блоки. Блок может состоять, например, из 512 байт. Пе- ред системой стоит сложная проблема учета свободных и занятых участков памяти. Другой проблемой является «фрагментация»: иногда неиспользуемая часть памяти может состоять из боль- шого числа очень маленьких кусочков, в то время как желатель- но (или, возможно, необходимо) хранить информацию в одной большой непрерывной (связной) области. В ранних операционных системах для крупных вычислитель- ных машин бедный пользователь находился на переднем крае бо- рьбы с этими проблемами. То же самое можно сказать о некото- рых современных операционных системах на малых ЭВМ. UNIX же берет всю борьбу на себя. Для вас, пользователь, файл — это просто последовательность литер (байтов). Как пользователь си- стемы UNIX вы абсолютно не подозреваете о таких вещах, как размер блока и представление данных. Вы можете даже абсолют- но ничего не знать о том, какая физическая среда используется для хранения ваших файлов. Если вы по профессии столяр и представляете себе файл 11 как средство для резьбы по дереву, то вы можете считать, что ЭВМ запоминает информацию наподо- бие крошечных царапин на дереве. Эта иллюзия не помешает вам эффективно использовать UNIX. Более существенным яв- ляется то, что, хотя технология хранения информации постоянно изменяется, представление пользователя системы UNIX о файле остается неизменным. Может даже случиться так, что следующий потрясающий прогресс в технологии хранения информации дей- ствительно приведет к тому, что информация будет запоминаться в виде царапин на деревянной доске. Доска может меняться, так и На английском языке «file» помимо архивной папки дела озна- чает также «отделка», «шлифовка».— Прим, ред. 2*
36 Часть I. Идеи и концепции что термины «вход в систему» (log in) и «выход из системы» (log out) будут иметь буквальный смысл 11. Вам не следует также беспокоиться о размере каждого файла. UNIX отведет место для каждого файла, каким бы большим он ни был; UNIX ничего не имеет против, если файл впослед- ствии изменится в размере. Единственным ограничением явля- ется общий размер физической памяти и менее чем обременитель- ное требование, состоящее в том, что размер каждого файла не может превышать миллиард литер — так как большинство систем не располагает миллиардом литер памяти, это требование подобно требованию, гласящему, что ни один человек не может владеть больше чем тысячью тонн золота. Постоянные и сменные файловые системы Вам необязательно вникать в подробности физических характе- ристик запоминающей среды, однако у файловых систем сущест- вует одно общее свойство, о котором вы должны знать: они могут быть постоянными или сменными. Все системы UNIX имеют некоторую постоянную файловую область. Она располагается на таких устройствах, как фиксиро- ванные диски, которые всегда подключены к ЭВМ. Постоянная файловая область могла бы также располагаться на диске, кото- рый потенциально сменный, но фактически никогда не снимается. Чтобы использовать все возможности, предоставляемые UNIX, необходим разумный объем памяти для хранения файлов: боль- шинство систем имеют память на миллионы литер, а некоторые — на сотни миллионов литер. Совсем другая картина наблюдается в случае небольших микро-ЭВМ с гибкими дисками. В некоторых реализациях UNIX вся файловая система рас- полагается в постоянной памяти. На других постоянная память дополняется сменной памятью. В качестве сменной памяти может служить большой диск, который монтируется (т. е. устанавли- вается на ЭВМ), когда работает определенная группа пользова- телей, или же это может быть относительно небольшой диск, при- надлежащий одному пользователю, который монтируется при входе пользователя в систему и демонтируется, когда пользова- тель выходит из системы. Постоянная файловая система может быть разнесена на не- сколько различных физических дисков, но вы как пользователь касаетесь этого не более чем характеристик самих дисков. Для вас файловая система UNIX есть единое целое. В случае монти- 11 Игра слов в английском языке. Слово «log» означает «бревно», «по- лено»-— Прим. ред.
Гл. 3. Файлы 37 руемой файловой системы, с другой стороны, вам необходимо иметь представление о том, где хранятся ваши файлы, для того чтобы знать, что монтировать. Разделение и защита файлов Точно так же, как вы работаете на ЭВМ совместно с другими поль- зователями, вы разделяете и ее файловую систему. Именно через файловую систему вы можете извлечь выгоду от наличия других пользователей. UNIX дает вам возможность получить доступ к файлам, принадлежащим другим пользователям, и в большинстве коллективов, использующих UNIX, господствует дух сотрудниче- ства. Пользователи используют файлы друг друга, будь то дело- вые письма, черновики книг, программы или данные, и в резуль- тате все оказываются в выигрыше. К сожалению, человеческое общество редко основывается на свободном и открытом совместном использовании вещей. Немного найдется общин, где люди оставляют свои дома открытыми, и их собственность доступна для всех, хотя где-нибудь на земном ша- ре еще могут существовать общества — без сомнения, прозван- ные «примитивными»,— находящиеся в этом счастливом состоя- нии. Вместо этого большинство людей держат двери своих домов под замком. В системе UNIX также предусмотрены свои замки. Вы можете защитить свои файлы так, что никто другой не сможет изменить их, или, если вы хотите иметь настоящую защиту, так, что никто не сможет даже заглянуть в них. Без сомнения, вам потребуется установить такие защитные запоры на некоторые из ваших собст- венных файлов, но пытайтесь сохранить общество пользователей UNIX настолько открытым, насколько это возможно. Важно отметить, что, как писал Баурн (Bourne, 1983), очень немногие из Bell Laboratories защищали свои файлы; это не могло не способствовать успеху системы UNIX как совместному проекту. В следующей главе мы рассмотрим доступ к файлам и защиту файлов более подробно. Помимо того .что вам может понадобится обращаться к файлам, принадлежащим другим пользователям, вы наверняка захотите иметь доступ к некоторым файлам, предоставляемым самой системой UNIX. UNIX располагает большим количеством файлов общего пользования. Среди них — все доступные вам встроенные программы (эти программы обычно доступны в двоичном виде), сюда входят также файлы, которые содержат документацию по системе UNIX, доступную в интерактивном режиме. Таким образом, файловая система является сплавом ваших файлов, системных файлов общего пользования и файлов других пользователей. Все они предоставляются как единое целое.
38 Часть I. Идеи и концепции Управление большим числом файлов После того как вы в течение года поработаете с системой UNIX, вы сможете гордиться обладанием сотней различных файлов. Если у вас нет системы для организации ваших файлов, то вскоре наступит такое время, когда вы забудете, какие файлы связаны с каждым из ваших проектов. (Если вы когда-либо работали с гибкими дисками, вам, возможно, приходилось частично разре- шать эту проблему. Типичный гибкий диск может хранить от 10 до 20 файлов; если вы работаете со 100 файлами, что требует от 5 до 10 различных гибких дисков, вам необходимо продумать, как эти файлы лучшим образом разбить на отдельные семейства — по одному семейству на каждый гибкий диск.) Независимо от физической среды, на которой запоминаются файлы, операционные системы должны помогать управлять фай- лами, обеспечивая общую структуру, позволяющую разбивать файлы на малые семейства и следить за тем, как эти семейства связаны друг с другом. Требования к файловой системе В первой части этой главы мы обсудили способы хранения отдель- ных файлов. Подводя итоги, отметим, что должен знать поль- зователь: • файлы могут представлять текстовую или двоичную информа- цию, однако все файлы хранятся внутри ЭВМ одинаковым образом: в виде последовательности байтов. Конкретная система кодирования, используемая для представления тек- стовых файлов, не имеет значения; • в некоторых системах UNIX файлы могут размещаться на сменных носителях. Во второй части главы мы обсудили способы использования файлов. Это была подготовка к следующей главе, в которой будут рассмотрены вопросы связи файлов друг с другом. Мы определили следующие требования к файловой системе: • файловая система должна предусматривать некоторую общую структуру, помогающую вам управлять файлами; • она должна позволять вам обращаться к своим собственным файлам, к файлам других пользователей и к системным фай- лам общего пользования; • она должна предусматривать механизм защиты; • она должна охватывать все файлы, даже если они находятся на сменных носителях. В качестве затравки к следующей главе можно сказать сле- дующее. Если вы работали с файлами в других операционных системах, то вас ожидает приятный сюрприз. Файловая система UNIX настолько проста и единообразна, что вас может только удивлять, почему те системы, с которыми вы работали ранее, такие сложные.
ГЛАВА 4 СТРУКТУРА ФАЙЛА Вы не можете произнести «trees», не улыб- нувшись. Из житейских наблюдений Предоставление хорошей файловой системы было первоочередной целью UNIX. Файловая система является краеугольным камнем всей операционной системы UNIX. Основной метод, который уже сам по себе обеспечивает выпол- нение большинства требований, изложенных нами в конце пре- дыдущей главы,— это организация иерархической файловой структуры. Основным строительным блоком этой иерархии слу- жит каталог (директорий), поэтому мы начнем с объяснения, что это такое. Каталоги Каждая файловая система должна хранить записи с именами всех существующих файлов и местонахождением этих файлов. Это осу- ществляется с помощью каталога (оглавления, директория). Каталоги могут содержать также другую информацию о каждом
40 Часть I. Идеи и концепции файле, такую как спецификация пользователей, которые могут работать с файлом. В некоторых операционных системах каждому пользователю отводится по одному каталогу, в то время как в других отводится один каталог для каждого диска или ленты. Поскольку система UNIX не связывает пользователя с физической средой, она ис- пользует первый подход. Однако эта концепция значительно обобщена. Каталог трактуется как обычный файл; в частности, у него есть имя, аналогичное имени любого другого файла. (Ката- лог является на самом деле двоичным файлом, так как, хотя имена файлов внутри каталога хранятся в текстовой форме, информа- ция о файлах представляется в двоичном виде.) Поскольку каталог — это обычный файл, то один или несколь- ко файлов из одного каталога сами могут быть каталогами. Это простое утверждение является фундаментом всей файловой систе- мы UNIX. Мы объясним, почему это так, рассмотрев вначале конкрет- ное применение: личный телефонный каталог. Личный телефонный каталог Предположим, что вы тратите много времени на телефонные звонки и особенно на поиск телефонных номеров абонентов в массивном телефонном справочнике. Чтобы сэкономить время, вы решили записать на небольшой карточке фамилии и телефон- ные номера людей, которым вам приходится наиболее часто зво- нить. Эта карточка лежит рядом с вашим телефоном и служит для вас личным каталогом. Спустя некоторое время карточка ока- зывается заполненной, и вы решаете расширить эту систему, ис- пользуя несколько карточек. Решив создать новую систему, вы обдумываете, для каких целей вы используете телефон и делаете заключение, что вы пользуетесь им для следующих четырех нужд: • флирта; • поиска информации; • споров; • поиска заверений. Поэтому вы создаете четыре карточки, озаглавив их кокетки, знатоки, спорщики и льстецы и записываете соответствующие фамилии и телефонные номера в каждую из них. Некоторые фа- милии могут быть занесены в несколько карточек. Эти четыре новых каталога являются подкаталогами вашего основного ката- лога. Основной каталог переработан и содержит только фамилии тех, кому вы действительно часто звоните плюс ссылки на подка- талоги. Основная карточка может выглядеть следующим образом:
Гл. 4. Структура файла 41 анна дерек знатоки кокетки льстецы мама спорщики 7699 7698 см. отдельный каталог см. отдельный каталог см. отдельный каталог 01-999-9999 см. отдельный каталог Основной каталог обычно лежит рядом с вашим телефоном. Однако, если у вас есть настроение с кем-нибудь поспорить, вы кладете каталог спорщики рядом с телефоном вместо основ- ного каталога. После счастливого часа, потраченного на спор, вы можете снова вернуться к основному каталогу, а затем, возможно, выбрать другой подкаталог. Если эта система работает нормально, вы можете ее расши- рить на несколько уровней в глубину. Предположим, что ка- талог спорщики заполнился. Вы делите его на два подкаталога, скажем агрессивные и саркастические, и оставляете в каталоге спорщики только ваших любимых (т. е. наиболее ярых) оппо- нентов, которым вы звоните почти всегда, когда чувствуете острое желание поспорить. Ваш каталог спорщики теперь со- держит: агрессивные см. отдельный каталог саркастические см. отдельный каталог хедер 7550 Может быть, это и не лучший способ организации ваших лич- ных телефонных каталогов, но это хороший метод организации файловой системы, и именно этот метод использует система UNIX. Организация каталогов в системе UNIX Когда вы работаете в системе UNIX, у вас всегда есть текущий каталог-, он аналогичен карточке, которая лежит в данный момент у телефона. Вы можете менять текущий каталог так часто, как пожелаете. Когда вы входите в систему, то первоначально вашим текущим каталогом является каталог, называемый личным-, он аналогичен основной карточке телефонного каталога. Вы размещаете в своем личном каталоге файлы, которые используете практически всегда, когда входите в систему. В нашем случае мы будем предполагать, что имеются два таких файла: наше любовное послание, храня-
42 Часть I. Идеи и концепции щееся в файле lovepoem (лирика), и еще более нежный файл reply (ответ), который содержит ответ на это послание. Для каж- дого нашего проекта мы создаем подкаталоги основного каталога. В частности, у нас есть каталог model (модель), содержащий фай- лы для системы моделирования экономики, разработкой которой мы занимаемся, и каталог articles (статьи), представляющий жур- нал, который мы редактируем. Первый каталог содержит два - файла: program (программа) и data (данные); второй каталог содержит три файла: comment (комментарий), news (новости) и reviews (обзоры). Структура нашего каталога приведена на рис. 4.1. На самом деле структуру можно было бы расширить и даль- ше, если бы такие файлы, как reviews, сами были каталогами. (личный каталог) articles iovepoem model reply comment news reviews data program Рис. 4.1. Дерево каталогов пользователя. Вы можете присвоить различным файлам одинаковые имена при условии, что эти файлы находятся в различных каталогах. Так, мы могли бы расширить каждый из наших каталогов, вклю- чив в него файл lovepoem, где каждый из файлов lovepoem мог бы содержать различные любовные стихотворения. Можно также делать обратное: иметь ссылки на один и тот же файл из разных каталогов. В этом случае файл может иметь одно и то же имя в каждом каталоге или же на него можно ссы- латься по разным именам из разных каталогов. (Можно про- вести аналогию с телефонным каталогом: отладчик в телефонном каталоге знатоки может быть той же самой персоной, что и брюзга в каталоге спорщики.) Достоинства каталогов Действительно ли стоит разбивать файлы на группы с отдельными каталогами? Первое, что следует подчеркнуть — делая это, вы ничего не теряете. Независимо от вашего текущего каталога вы можете обращаться также ко всем файлам, хранящимся в других каталогах. Это можно сделать с помощью маршрутного имени, которое мы объясним позднее. Поэтому использование раздельных каталогов не имеет существенных недостатков; значительно важнее, что это дает следующие четыре убедительных преимущества:
Гл. 4. Структура файла 43 • чем меньше, тем лучше. Одной из наиболее используемых операций в системе UNIX является вывод на дисплей имен всех файлов, содержащихся в каталоге. Вы регулярно это делаете, чтобы проверить, какие файлы существуют, и, воз- можно, напомнить себе об их именах. Если каталог неболь- шой, то намного легче найти данное имя файла и значительно труднее не заметить ошибку, такую как нежелательный файл; • защита. Поскольку каталоги представляют собой обычные файлы, то вы можете приписать им защиту. Так, вы можете защитить от каких-либо изменений или даже просмотра дру- гими вашу экономическую модель просто установкой соот- ветствующей защиты каталога model (альтернативным ре- шением является определение всех файлов, требующих за- щиты, и защита каждого по отдельности); • управление. Хорошо известно, что в любом вычислительном проекте гораздо больше времени тратится на сопровождение, чем на первичную разработку проекта. В проекте, касаю- щемся программирования, сопровождение состоит во внесе- нии небольших изменений и исправлений в программы в течение всего времени их использования. Одна из основных причин, почему сопровождение занимает так много времени, состоит в том, что если вы начинаете вносить изменения после шестимесячного перерыва в работе, то вы тратите огромное количество времени, пытаясь понять, что делают ваши про- граммы и как они связаны друг с другом. Даже в том случае, если ваш проект касается подготовки документов, а не про- граммирования, вы все равно будете тратить изрядное время на работу, эквивалентную сопровождению; изменение суще- ствующих документов, разбиение их на части и объединение отдельных частей в новые комбинации. Независимо от того, являетесь ли вы писателем, программистом или тем и другим, структура каталога, которую вы используете, оказывает хотя и небольшое, но все же важное влияние на сопровожде- ние. Когда вы планируете структуру каталога, задайте себе вопрос: «Если я снова вернусь к этому проекту после шести- месячного перерыва, будет ли сразу очевидным назначение каждого файла?» Ясно, что выбор имен файлов имеет в данном отношении решающее значение; если ваше воображение спо- собно давать только имена наподобие filel (файл1), file2 (файл2) ит. д., то проблемы сопровождения программ будут для вас значительными. Однако выбор хорошей структуры каталога, основанный на иерархии, которая отражает суть вопроса, важен точно так же, как и выбор вами имен файлов. Люди, которым не удается создать понятную файловую струк- туру, будут позднее наказаны тем, что потратят часы, распе-
44 Часть I. Идеи и концепции чатывая все свои файлы, пытаясь понять цель каждого файла и его связь с другими файлами; • легкость адаптации. С сопровождением связана адаптация, т. е. приспособление к новой среде. Кто-нибудь другой станет редактором обзорного раздела вашего журнала; в свою оче- редь вашу экономическую модель придется применить к эко- номике другой страны, и, хотя моделирующая программа все равно будет работать правильно, все данные для нее необхо- димо изменить. Одним из решающих факторов в определении, успешна ли будет адаптация, является структура вашего каталога. Если эта структура отражает естественное подраз- деление вашего проекта, то вы станете такими же приспособ- ляемыми, как воробей, крыса или Фортран. Быть пионером Многие из нас, использующих ЭВМ, большие консерваторы, возможно, наученные горьким опытом. Мы овладеваем небольшим числом простых средств, которые, как нам кажется, хорошо ра- ботают, и затем не расстаемся с ними до конца своих дней. Даже если вас убедили изложенные нами доводы о достоинствах орга- низации иерархии каталогов, вы, вероятно, все же попытаетесь увильнуть от их создания, может быть, хотя бы до завтра. Однако хоть раз попытайтесь быть пионером. Небольшие первоначаль- ные затраты времени окупятся позднее с лихвой. Блестящий спо- соб заставить себя думать о структуре каталогов — это придер- живаться правила, что ни один из ваших каталогов не должен содержать более двенадцати файлов. Это заставит вас исследовать мир структурированных файловых систем. Изучив его, вы можете спокойно вернуться в исходную точку и модифицировать свой первоначальный, навязанный самому себе принцип. Но, пока вы не изучите этот мир, у вас никогда не будет опыта в принятии подходящих решений. Может быть, полезно считать, что аналогом архивной папки с документами в системе UNIX является каталог, а не файл. Каждая папка является небольшой подшивкой связанных между собой документов. Возможно, вы начинаете думать, что мы заходим слишком да- леко с настойчивым рекламированием достоинств каталогов (а это еще не все) Если так, то, может быть, вы и правы, но дело в том, что на практике каталоги являются ресурсом, который на- чинающие пользователи UNIX используют плохо, и это отно- сится к их безвозвратным потерям. Когда во второй части книги мы начнем знакомиться с практическим материалом по системе UNIX, мы вскоре станем создавать новые каталоги.
Гл. 4. Структура файла 45 Древовидная структура Структура, в соответствии с которой UNIX хранит свои файлы, называется деревом (tree). Причина для такого назначения оче- видна. Ветвящаяся структура в точности напоминает живое дерево. Деревья являются прекрасным способом структурирования (мы настойчивы в своем рекламировании). В большинстве фирм, например, управление осуществляется по структуре дерева. Дей- ствительно, самый простой способ показать, как организована фирма,— это представить информацию в виде дерева. Древовидные структуры широко используются в информати- ке для представления структур данных. Таким образом, идея использования дерева для представления файловой системы не нова; это применение метода, хорошо проверенного временем. Использование в UNIX древовидной файловой системы оказалось настолько успешным, что эта идея была адаптирована другими и почти повсеместно стала нормой для всех файловых систем, кроме простейших. Если вы хотите побольше почитать о применении деревьев, то обратитесь к книге Д. Кнута (1976) «Искусство программи- рования для ЭВМ» т. 1 — одной из классических книг по ин- форматике. Она содержит массу информации, среди которой материал по деревьям занимает только небольшую часть. Специалисты по информатике, будучи народом своенравным, имеют обыкновение рисовать свои деревья вверх ногами. Мы бу- дем следовать этому правилу — действительно, приведенная нами выше структура каталога изображена в виде дерева с корнем — личным каталогом — вверху. В UNIX принята терминология, которая основана на представлении дерева файловой системы в виде генеалогического дерева. Так, о каталоге внутри катало- га говорят, что он является дочерним каталогом (потомком); подобным образом вышестоящий по отношению к потомку ката- лог называется родительским каталогом (родителем). Поэтому в нашем примере model является потомком личного каталога, а личный каталог — это родитель каталога model. (Каждый потомок имеет только одного родителя, так что структура фай- ловой системы UNIX фактически выглядит как генеалогическое дерево однополого типа.) Полное дерево Мы рассмотрели одно из указанных в конце гл. 3 требований к файловой системе: организацию структуры, которая помогает вам управлять файлами. Настало время перейти к двум другим требованиям: обеспечению доступа к чужим файлам и работе с файлами на сменных носителях. Оба эти требования удовлет-
46 Часть I. Идеи и концепции воряются путем расширения древовидной структуры, которую мы только что описали. Пока мы ограничились лишь небольшой частью полного де- рева. Ваш личный каталог в действительности является подка- талогом в объемлющей структуре, которая представляет собой единое дерево, охватывающее всю файловую систему UNIX. Кор- нем этого дерева служит каталог с именем root (корень) — те- перь, возможно, вы начинаете понимать, почему root является входным именем суперпользователя. Каталог root содержит несколько подкаталогов, один из которых называется usr1). (Систма UNIX имт склонность к сокращниям, поэтому в имнах часто опускаются отдльны буквы таки как «е». Многи из нас считают их излишними.) Каталог usr содержит все файлы, созданные пользователями UNIX. Файлы общего пользования, встроенные в систему UNIX, находятся в других подкаталогах root; один из этих подкаталогов называется bin и содержит дво- ичные версии программ UNIX, которые, возможно, вы захотите использовать. Файловые системы часто организуются так, что root bin usr spel* you him articles lovepoem model reply comment news reviews data program Рис. 4.2. Полное дерево каталогов. каталог usr состоит из небольшого числа подкаталогов, по одно- му для каждого пользователя; каждый подкаталог является личным каталогом некоторого пользователя, и именем этого подкаталога служит входное имя данного пользователя. Так, если ваше входное имя — you, a him — входное имя другого пользователя, то дерево получит вид, представленный на рис. 4.2. Достоинство такой структуры в том, что вы можете ссылать- ся на любой файл в файловой системе, просто задавая его пол- ное маршрутное имя, начиная с root. Чтобы обратиться, напри- мер, к файлу lovepoem (лирика), маршрут определяется следую- щим образом: 1) От английского user — пользователь.— Прим. ред.
Гл. 4. Структура файла 47 • начать с root, • перейти к каталогу usr, • затем перейти к каталогу you, • файл lovepoem находится в этом каталоге. В системе UNIX это записывается в виде маршрутного имени. /usr/you/lovepoem Косая черта 7’ в начале маршрута служит обозначением ката- лога root. Это полное маршрутное имя может быть использовано вами или любым другим пользователем для обращения к фай- лу lovepoem независимо от текущего каталога. Если lovepoem находится в текущем каталоге, то такое относительно длинное имя задавать не обязательно. Достаточно задать имя lovepoem. Подобным же образом, если вы вспомните пример сеанса, при- веденный в гл. 1, файл jobletter798 находился в текущем ката- логе, поэтому не было необходимости обращаться к нему по- средством задания полного маршрутного имени. Полное дерево дает те же преимущества, что и деревья от- дельных пользователей, но в большей степени. Так, становится легче не только понимать, как файлы каждого пользователя свя- заны друг с другом, но также видеть взаимные связи всех фай- лов в системе UNIX. Каталоги могут быть небольшими. Система UNIX может содержать тысячи файлов, но в самом большом ка- талоге может храниться только сотня файлов. Небольшие ка- талоги позволяют быстрее осуществлять поиск файлов. Файлы на сменных носителях Полное дерево дает дополнительное преимущество: оно удовлет- воряет требованию обеспечения работы с файлами на сменных носителях. Если вы из дерева, изображенного на рис. 4.2, удалите ката- лог you и все, что расположено ниже you (т. е. удалите все свои личные файлы), то в результате этого останется все еще пра- вильное дерево. То же самое справедливо и для любого другого поддерева основного дерева. Поэтому, если файлы на каждом сменном носителе организованы в виде дерева, это поддерево может подсоединяться и отсоединяться от основного дерева, когда устройство (например, диск) монтируется или демонти- руется. Полное дерево файлов на сменном носителе само назы- вается файловой системой. Таким образом, основная файловая система UNIX может сама содержать другие файловые системы точно так же, как каталог может содержать другие каталоги. Это правило можно сформулировать иначе. Если все ваши файлы хранятся на сменном диске, то дерево, растущее из ката-
48 Часть I. Идеи и концепции лога you, является отдельной файловой системой, хранящейся на этом диске. Эта файловая система может объединяться с основ- ной файловой системой, когда вы входите в систему и монтируете свой диск. Даже в том случае, если вся файловая память в вашей систе- ме UNIX постоянна, ее все же можно разделить, на отдельные файловые системы. Если, например, в вашей реализации UNIX имеются четыре постоянных диска, то с каждым из них можно связать отдельную файловую систему. Достоинство раз- деления состоит в том, что если один диск выйдет из строя, то будет потеряна только одна файловая система. Печально, если потерянной окажется основная файловая система или файловая система, содержащая ваши файлы, но в остальных случаях вы не будете испытывать больших неудобств. В целом общая сумма потерь меньше, чем если бы поломка диска привела к выходу из строя всей системы. В действительности во многих реализа- циях UNIX один постоянный диск может быть разделен на не- сколько файловых систем, чтобы придать системе еще большую гибкость. Все это на самом деле больше касается суперпользователя, чем рядового пользователя. Границы между дополнительными файловыми системами почти невидимы для обычного пользова- теля; вся файловая структура выглядит как единое дерево. Единственное, что оказывает влияние на рядового пользователя, это ограничение, запрещающее создавать ссылки на файл (да- вать одному и тому же файлу два имени), если этот файл нахо- дится в другой файловой системе. Это ограничение настолько несущественно, что многие пользователи, работающие в UNIX в течение нескольких лет, даже не подозревают, что постоянная дисковая память в их системе разделена на несколько файловых систем. Включив в книгу эти рассуждения, мы, возможно, попали под сильное влияние нашего друга Дотошного Дадли. Какую бы систему UNIX вы ни использовали, вы вскоре встретитесь с Дад- ли. Он знает все, что известно о UNIX, и, даже если вы придете к нему за простейшим советом, он прочтет вам 20-минутный монолог о наиболее изящных особенностях UNIX. Только одна незадача: когда вы уходите, то не очень-то понимаете, что же за ответ вы получили на свой простой вопрос- Введение в защиту Теперь мы видим, что сама по себе иерархическая организация файловой системы UNIX отвечает трем требованиям к файловой системе: обеспечению структуры для управления собственными файлами, разрешению доступа к прочим файдам и работе с фай-
Гл. 4. Структура файла 49 лами как в постоянной, так и сменной памяти. Наше последнее требование — система защиты — нуждается в дополнительных методах, и мы теперь сконцентрируем на них свое внимание. Двумя понятиями, важными для системы защиты UNIX, яв- ляются понятия «владелец» и «группа». Владельцы и группы Каждый файл UNIX имеет владельца. Обычно владелец пред- ставляется своим входным именем. Если вы создадите файл, то вы станете его владельцем на весь период его существования. Это касается даже тех случаев, когда файл переносится в оглавле- ние другого пользователя. Если другой пользователь скопирует один из ваших файлов, то, конечно, он может владеть копией, но оригинал — тот, который будет высоко оценен коллекционерами антиквариата в 2100 г.— еще ваш. Владельцем файлов, созда- ваемых самой системой UNIX, а не рядовыми пользователями, становится суперпользователь (root); теперь, вероятно, вы смо- жете оценить настоящую суперпользователя.. UNIX позволяет пользователям объединяться в группы. Группа обычно состоит из пользователей, работающих совместно над одним проектом, причем часто это также группа друзей. UNIX являет собой грозную диктатуру. Не вы решаете, кто ваши друзья; ваших друзей определяет суперпользователь, фиксируя, к какой группе вы принадлежите. Некоторые поль- зователи работают в одиночку и даже не пытаются узнать, при- надлежат ли они к какой-либо группе; другие извлекают выгоду из групп, давая членам своей группы привилегии (в форме досту- па к файлам) и отказывая в этом всем остальным. Кроме защиты, группы можно использовать также для сбора учетной информации. Если группы в вашей реализации UNIX играют важную роль, то вы можете обнаружить, что ваш личный каталог является прямым потомком не каталога usr, а каталога группы, который находится между you и usr. Некоторые пользователи UNIX имеют несколько различных входных имен. Вы можете, например, работать по совместитель- ству библиотекарем и хранить в ЭВМ библиотечные записи. В этом случае было бы разумно иметь отдельное входное имя, скажем librarian (библиотекарь), для вашей библиотечной ра- боты и сохранить входное имя you для остальной вашей работы. Достоинство этой двойной идентификации состоит в том, что если впоследствии библиотекарем станет кто-нибудь другой, то он может просто перенять у вас входное имя librarian. Вы только сообщите ему пароль. Он тогда станет владельцем всех файлов librarian, но вы по-прежнему будете владеть остальными своими файлами. (Если с ЭВМ работает только один человек,
50 Часть I. Идеи и концепции то он все же может иметь несколько различных входных имен, чтобы проявить различные стороны своего характера — одна из которых, естественно, обладает нравом суперпользователя.) Если у вас несколько различных входных имен, то вовсе не обязатель- но, чтобы все эти имена принадлежали одной и той же группе. Полномочия Система защиты UNIX основывается на том, что вы можете при- писать каждому файлу некоторые полномочия, которые контро- лируют разрешенные действия при работе с файлом. Существуют три типа полномочий: • полномочие на чтение, • полномочие на запись (т. е. на изменение), • полномочие на выполнение (т. е. использование файла как программы — см. ниже). (Лишь немногие читатели, видимо, не знакомы с терминами чте- ние и запись. Эти термины по смыслу близко соответствуют своему обычному значению. Чтение означает просмотр содержимого файла, а запись — любое изменение файла, т. е. создание файла, уничтожение его или изменение его содержимого.) Указанные три типа полномочий задаются независимо, хотя некоторые комбинации, такие как разрешение писать в файл и запрет на чтение из него, являются довольно странными. Кроме того, указанные типы полномочий могут быть приме- нены к каждому из следующих трех классов пользователей: • владельцам, • другим пользователям из группы владельца, • пользователям, не состоящим в группе владельца; мы будем называть таких пользователей «все остальные». Если класс пользователей не имеет полномочия, скажем, писать в некоторый файл, то UNIX не позволяет таким поль- зователям делать это, и таким образом данный файл защищается от записи. Приведем пример использования полномочий для обеспечения защиты. Если вы — владелец файла, вы можете установить полномочия таким образом, что • вы сможете читать и писать в файл, • члены вашей группы смогут только читать файл, • все остальные не могут даже читать файл. Поскольку имеются три типа полномочий и три класса поль- зователей, каждый из которых может получить соответствующее полномочие, то с каждым файлом связаны девять независимых
Гл. 4. Структура файла 51 атрибутов полномочий. (Дадли утверждает, что имеется десятый атрибут, используемый системными программами UNIX, и он готов объяснить это вам, если у вас найдется час свободного вре- мени.) Так как каталог представляет собой обычный файл, атри- буты полномочий могут применяться также и к каталогам. Наряду с термином полномочия используется термин права доступа, означающий то же самое. Кроме того, в документации по системе UNIX употребляется слово режим (mode), означающее набор полномочий, связанных с файлом, но мы попытаемся из- бежать употребления этого до некоторой степени бессмысленного термина. Мы будем применять естественную терминологию, также принятую в документации по UNIX, согласно которой полномо- чия на чтение, на запись и на выполнение означают соответствен- но разрешение читать, разрешение писать и разрешение выпол- нять. Естественно, не существует никаких правил для неограничен- ного диктатора — суперпользователя. Она может просмотреть или даже уничтожить все ваши файлы в любое -время, когда ей заблагорассудится, и ваши полномочия в данном случае не стоят тех байтов, в которых они записываются. Первоначальные полномочия, устанавливаемые при создании файла, определяются системой UNIX. Часто эти полномочия позволяют вам читать и писать, но всем другим пользователям — только читать. Однако вы можете изменить в любое время полно- мочия для любого файла, которым владеете, но не для файлов, которыми не владеете. Если вы интересуетесь изменением перво- начальных установок полномочий, то может оказаться, что это сделать сложнее; начните с просмотра раздела документации вашей системы UNIX под несколько туманным заголовком umask 1>. Полномочие на выполнение применимо только к трем типам файлов: • двоичным версиям программ, • файлам команд (см. гл. 7), • каталогам. В этом случае «выполнить» имеет совсем иной смысл, как мы вскоре объясним. Если файл не относится ни к одному из указанных типов, он не должен иметь полномочие на выполнение. Разрешение вы- полнять файл, который по своей сути не может быть выполнен, подобно разрешению покончить жизнь самоубийством (путем казни?). Сокращение от user mask — маска пользователя.— Прим. ред.
52 Часть I. Идеи и концепции Великий вредитель Прекрасная книга «Маленький сад» Лукаса Филиппса (Pan 1952) полна мудрости о садоводстве. (Следующее издание будет содер- жать специальное предупреждение специалистам в области ин- форматики прекратить взращивание своих деревьев корнями вверх.) В одном из наиболее удачных мест в книге говорится, что из всех вредителей, наносящих ущерб саду, наиболее опас- ный вредитель — вы сами. То же можно сказать и о файловых системах. Вы можете тщательным образом организовать защиту своих наиболее ценных файлов от уничтожения их другими поль- зователями, но наиболее вероятным субъектом, который их уничтожит, хотя бы случайно, являетесь вы сами. Поэтому меры защиты, которые вы можете предпринять против самого себя, весьма актуальны. Ниже мы коснемся этого вопроса более под- робно. Пока же поразмышляйте над тем печальным фактом, что внут- ри каждого из нас притаился могущественный и бессмертный Великий вредитель, всегда готовый выпрыгнуть наружу, когда мы ослабляем бдительность. Примеры защиты Для того чтобы показать вам, как можно использовать механизм защиты системы UNIX, мы приведем два характерных примера. Пример 1 Вы разработали новую великолепную программу для игры в шахматы, которая, какого бы ранга ни был ее противник, на- строена на большую борьбу, но все же всегда проигрывает. Та- кая программа имела бы миллионы покупателей и, конечно, принесла бы вам успех. Хотя вы с удовольствием позволяете членам своей группы использовать программу, вы не хотите, чтобы кто-нибудь похитил ее. Поэтому вы запрещаете всем, кро- ме себя, владельца, даже читать файл, содержащий исходную программу. Однако вы создаете второй файл, который содержит двоичный вид программы, и даете вашей группе разрешение на выполнение этого двоичного файла. Вы не даете им разрешение на чтение файла, поскольку в противном случае они могут сде- лать его копию. Пример 2 Когда вы, используя UNIX, создадите бестселлер, поместите каждую новую главу в отдельный файл. (Позднее мы приведем специальный пример как раз на эту тему.) Вы дадите остальным членам своей группы разрешение читать каждую главу. Пред-
Гл. 4. Структура файла 53 полагая, что вне вашей группы имеются дети, вы дадите «всем остальным» разрешение читать только те главы, в которых не со- держатся жгучие любовные сцены. Защита каталогов Считается, что вы «выполняете» каталог D, когда используете его для нахождения одного из файлов внутри D. Следовательно, если некоторый пользователь должен иметь доступ к любому из этих файлов или к любым файлам из подкаталогов D, он дол- жен иметь разрешение на выполнение каталога D. Разрешение читать дает только возможность выводить на дисплей имена фай- лов, содержащихся в каталоге D, но не позволяет добраться до самих файлов. Разрешение писать в каталог дает возможность добавлять в этот каталог новые файлы; пользователь может так- же уничтожить в этом каталоге любой файл, для которого не имеет разрешение писать (в некоторых системах UNIX он даже не нуждается в этом). Полномочия, связанные с каталогами, не обязаны быть таки- ми же, как полномочия, связанные с файлами внутри данного каталога. Так, вы можете позволить любым пользователям чи- тать и выполнять некоторый каталог, но запретить им просмотр отдельных файлов в этом каталоге. На самом деле можно было бы запретить читать все файлы в каталоге, сделав, таким образом, разрешение читать и выполнять данный каталог почти пустой привилегией. Если вы запретите всем остальным выполнять и читать ваш личный каталог, то у вас будет секретный набор файлов (сек- ретный от всех, кроме, естественно, суперпользователя). Когда другой пользователь будет просматривать файловую систему, ему будет казаться, что дерево усечено на ветви you, и ничего ниже you, по-видимому, не существует. Этот пользователь в свою очередь мог бы отсечь вас от своего личного каталога так, что вы не будете видеть его часть дерева. Поэтому каждый поль- зователь видит дерево, которое является подмножеством реаль- но существующего дерева. Два разных пользователя могут ви- деть разные подмножества. Защита от самого себя У некоторых людей такой ужасный почерк, что трудно поверить, что они сами могут прочитать то, что написали. Однако существу- ет, по-видимому, немного случаев, когда владелец не может чи- тать собственные файлы. Многие люди, защищаясь от Великого вредителя, защищают самих себя от записи в свои собственные файлы. В предположе-
54 Часть I. Идеи и концепции нии, что имеется полномочие на чтение этих файлов, получаются файлы «только для чтения». Владельцы создают файлы «только для чтения», не давая разрешения писать никому, даже самим себе. Этот метод работает, потому что UNIX распознает такие файлы, как специальный случай. Когда вы как владелец пытае- тесь писать в такой файл, UNIX не выдает свой обычный ответ «Нет, вы не можете», а вместо этого спрашивает «Вы действи- тельно хотите писать в этот файл доступный только для чте- ния?» (хотя на самом деле этот вопрос формулируется более кратко). Если вы явно отвечаете «да», то система производит запись. Однако вы имеете шанс сказать «нет», если вы ошиблись и чуть-чуть не затерли ваше самое ценное сокровище. Мы при- ведем подробный пример этого метода «второго шанса» в гл. 6. Ограниченность файловой памяти Никто никогда не хочет расставаться с файлом. Всегда су- ществует некоторая вероятность того, что файл может оказаться полезным в будущем, хотя бы для историка, интересующегося примитивными разработками на ЭВМ. Все же однажды вы оказываетесь перед необходимостью уничтожать файлы, особенно если ваша система UNIX бази- руется в основном на постоянной памяти. По самой своей при- роде постоянная память имеет фиксированный общий объем. Чтобы отсрочить несчастливый день и сделать его менее несчаст- ливым, когда он все-таки наступит, стоит принять за правило в конце каждого сеанса уничтожать файлы, которые в действи- тельности уже не нужны. Всегда найдутся файлы промежуточ- ных результатов или ранние версии документов, которые впо- следствии были заменены, как, например, первые 795 писем по поводу найма на работу, упоминавшиеся в гл. 1. Если вы храните такие файлы слишком долго и по понятным причинам не используете их, то вы в конце концов забудете, что они собой представляют. Позже вы будете бояться их уничтожить, по- скольку будете думать, что они содержат что-либо существенное, но теперь забытое. Может быть, это покажется вам нереальным, но это происходит сплошь и рядом. Даже когда наступает несчастливый день, некоторые реали- зации UNIX облегчают душевную боль посредством архивной системы. В такой системе вы можете сохранить файлы во вспомо- гательной памяти, например на магнитных лентах. Позднее, если вам действительно понадобится некоторый файл, после того как вы его удалили из основной файловой системы, его мож- но по крайней мере восстановить из архива, хотя на это может понадобиться несколько часов или даже дней. В некоторых боль- ших вычислительных центрах, например, работают удаленные
Гл. 4. Структура файла 55 от пользователей операторы, которые монтируют архивные лен- ты ежедневно в некоторое установленное время. (Если вы будете читать об архивах в документации по системе UNIX, то будьте внимательны. Термин «архив» имеет в ней два значения. В систе- ме UNIX принято называть «архивом» библиотеку программных фрагментов; это не совпадает с общепринятым использованием термина «архив» для обозначения хранилища файлов во вспомо- гательной памяти.) Магнитные ленты дешевле дисков (хотя устройства управле- ния магнитными лентами дороги), и на самом деле дешевле дер- жать большое количество материалов в архиве и хранить их в те- чение нескольких лет.
ГЛАВА 5 ВВОД И ОБОЛОЧКА Прекрасное Эхо, наипрелестнейшая ним- фа, что живет невидимой внутри своей воздушной оболочки. Мильтон Цель этой главы — объяснить, как вводится информация в UNIX и как UNIX интерпретирует то, что вы ввели. Будем полагать, что в качестве устройства ввода используется клавиа- тура, но аналогичные принципы применимы и к другим вводным устройствам, даже при непосредственном вводе речи. Клавиатуры Если проанализировать несколько различных клавиатур для ввода данных в ЭВМ, то окажется, что с точки зрения набора печатных литер они во многом схожи. Могут обнаружиться не- большие отличия, например знак доллара на том месте, где в дру- гой клавиатуре располагается знак фунта стерлингов, или знак ударения на месте двойной кавычки, но эти отличия несуществен- ны. Что более важно, так это отличие в управляющих литерах — клавишах с пометками типа DEL (удаление), ESC (авторегистр), BREAK (останов) и других, которые выполняют функции, не связанные с выводом литер на дисплей. Эти клавиши в разных
Гл. 5. Ввод и оболочка 57 клавиатурах существенно отличаются. Операционные системы разрабатываются с расчетом на самые различные терминалы: предполагается, что пользователям будут доступны определен- ные функции, но клавиши, используемые для исполнения этих функций, могут быть различны в различных клавиатурах. По- этому вам необходимо выяснить, какие клавиши вашего терми- нала используются для некоторых функций, описанных в этой главе. Сети Становится все более обычным объединять ЭВМ в сети. Одно из достоинств сетей состоит в том, что, используя электронную почту, можно посылать сообщения другим пользователям сети; ряд коммерческих предприятий целиком основан на такого рода почте как основном способе передачи информации. В некоторых сетях пользователю доступна только одна ЭВМ, и электронная почта становится единственным средством коммуникации с ос- тальной частью сети. В других сетях пользователю могут быть доступны несколько различных вычислительных систем при условии, что он зарегистрирован в них; эти системы могут рабо- тать под управлением разных операционных систем. (В некото- рых системах можно работать одновременно с несколькими раз- личными операционными системами с одного и того же термина- ла. Для начинающего, однако, вполне достаточно и одной опера- ционной системы.) Сети удобны для пользователей. Они предоставляют разно- образные гибкие средства для связи как с людьми, так и с машин- ными файлами. Однако сети несколько усложняют взаимодей- ствие пользователя с UNIX. Прежде чем войти в UNIX, вам не- обходимо указать, какую ЭВМ вы предполагаете использовать; фактически вначале вам необходимо войти в сеть. Войдя в сеть, вы можете обнаружить, что программное обеспечение, управляю- щее сетью, имеет ряд специфических правил, касающихся уп- равляющих литер вашего терминала. В идеале это воздействие сети должно быть минимальным, так как хорошая сеть прозрачна для пользователей. В этой книге мы не будем касаться каких-либо усложнений, вызываемых сетями, но очевидно, что, если вы работаете с UNIX через сеть, вам необходимо уяснить правила работы с исполь- зуемой вами сетью, прежде чем начать знакомиться с собственно системой UNIX. Ввод с клавиатуры Обычно обмен сообщениями пользователя с UNIX произво- дится целыми строками. Есть, конечно, ряд программ, выпол- няемых под управлением UNIX, которые вводят данные в «сы-
68 Часть I. Идеи и концепции ром» виде, т. е. по одной литере за раз, но это скорее исключение, чем правило. Поэтому UNIX обычно не анализирует строку, которую вы вводите с клавиатуры терминала до тех пор, пока не нажата клавиша RETURN (возврат каретки), указывающая на конец строки. Это полезно, поскольку, если при вводе вы допустили ошибку и заметили ее, можете ее исправить до того, как UNIX среагирует на то, что вы ввели. (Клавиша RETURN в различ- ных терминалах может иметь самые различные названия, на- пример CR или NEWLINE.) Есть два способа исправить ошибку. Наиболее часто исполь- зуемый способ состоит в стирании последней введенной литеры. Для этого вы нажимаете на клавишу, имеющую функцию «сте- реть». На вашем конкретном терминале наиболее вероятно это может быть клавиша BACKSPACE (возврат на шаг), DEL (удале- ние) или #. Мы ее будем называть просто клавишей стирания. Вы можете нажимать на клавишу стирания столько раз, сколько хотите. Так, если вы нажмете на нее пять раз, то вы сотрете по- следние пять набранных литер. Вы не можете, естественно, сте- реть больше литер, чем было набрано в текущей строке. Если при вводе строки вы допустили много ошибок, то може- те «отменить» эту строку, нажав другую специальную клавишу, точное положение которой зависит от вашего терминала. Вы мо- жете затем начать ввод строки заново. В качестве примера предположим, что клавишей стирания служит клавиша (#), а клавишей отмены строки — клавиша «@», и рассмотрим следующий ввод: Моя первая мысль® Моя второ#ая мсл##ысль Здесь первая строка была отменена и UNIX автоматически начала новую строку. Во второй строке были стерты литеры «о» и «сл». Предполагается, что в конце второй строки была нажата клавиша RETURN, чтобы передать строку системе UNIX. Об- щий результат в точности такой же, как если бы была набрана одна строка: Моя вторая мысль Кроме клавиш стирания и отмены некоторые терминалы могут иметь дополнительные средства «локального редактирования», такие как вставка добавочных литер в любое желаемое место в текущей строке. Прокрутка Когда вы работаете в UNIX с обычного дисплея, у вас могут возникнуть трудности, если команда выводит больше информа- ции, чем размещается на экране. Примером может служить коман-
Гл. 5. Ввод и оболочка 59 да, которая выводит на дисплей длинный файл. Вполне вероятно, что информация будет выведена с такой скоростью, что вы не ус- пеете ее прочитать до того, как она исчезнет в верхней части экрана. Для решения этой проблемы наиболее часто использу- ются два способа. В одних реализациях UNIX останавливает вывод после заполнения экрана информацией, давая тем самым вам возможность прочитать ее. Когда вы готовы продолжить работу, вы нажимаете на клавишу и происходит следующее за- полнение экрана. Общее правило таково: клавиша RETURN продвигает изображение на экране на одну строку, а любая дру- гая клавиша продвигает его на следующую экранную страницу. Это пример прокрутки (термин используется по аналогии с про- круткой пленки в фильмоскопе). Другое «решение» проблемы — это возложить остановку изображения на вас. В большинстве терминалов используются специальные управляющие литеры, которые позволяют «замора- живать» и «размораживать» изображение на экране. Обычно вы можете заморозить изображение, нажав клавишу «s» при нажа- той клавише CONTROL (точно так же, как для ввода прописной буквы «S» вы нажимаете клавишу «s» при нажатой клавише смены регистра). Мы будем следовать общепринятой практике исполь- зования записи вида Дх для обозначения того, что литера х на- бирается при нажатой клавише CONTROL. Если вы набираете /\s, то изображение на экране замораживается и вы можете его прочитать, прежде чем информация исчезнет; при наборе Aq изо- бражение размораживается и информация вновь начинает бы- стро мелькать. В некоторых реализациях UNIX имеются программы more или page, которые можно использовать для просмотра больших файлов. Полный дуплекс и опережающий ввод Почти наверняка ваш терминал будет связан с UNIX в режиме полного дуплекса. Это означает, что вы можете говорить что- либо системе в то же самое время, когда она сообщает что-либо вам. В общем случае, когда обе стороны говорят одновременно, нет возможности вести цивилизованную беседу, но при трех об- стоятельствах одновременный разговор может быть полезен Первый случай: вы просматриваете файловую систему и на- ходите, что у Дадли есть файл hints. Думая, что этот файл может содержать полезные советы по работе в UNIX, и заметив, что Дадли великодушно разрешил всем читать этот файл, вы выво- дите этот файл на дисплей. К сожалению, выводимый файл со- стоит в основном из скучнейших подробностей и, что еще хуже, все тянется и тянется. Система UNIX уже вывела на дисплей пятьдесят страниц, а никакого признака конца нет. Чтобы обес-
60 Часть I. Идеи и концепции печить выход из подобных ситуаций, в UNIX имеется клавиша останова. Если вы нажмете на эту клавишу (ее расположение также зависит от типа терминала) в момент, когда система гово- рит с вами, она (обычно) немедленно замолкает и запрашивает следующую команду. Вы можете воспользоваться клавишей оста- нова, чтобы остановить UNIX и в тот момент, когда она не вы- водит информацию, а молча выполняет очень длинную команду; особенно это полезно в том случае, когда вы запоздало обнару- жили, что изначально ввели с клавиатуры неверную команду. Прежде чем вы начнете использовать любую операционную си- стему, выясните, какая клавиша на терминале выполняет функ- цию останова, так как она может сослужить вам хорошую служ- бу. Очень жаль, что люди не снабжены такими же клавишами останова. Действие, вызываемое нажатием на клавишу останова, в до- кументации UNIX называется прерыванием. В общем случае термин прерывание имеет в вычислительной технике более широ- кий смысл, чем останов команды пользователем. Второй случай использования одновременного разговора состоит в том, что вы можете загодя вводить информацию. Так, если ваш текущий процесс занимает длительное время, вы може- те набирать последующие строки ввода, пока ожидаете заверше- ние процесса. Эти строки должны соответствовать тому, что по- требует UNIX. Так, если вы знаете, что далее UNIX будет у вас спрашивать да или нет, вы можете ответить «да» до того, как будет задан вопрос. Аналогично, если вы знаете, что UNIX далее будет запрашивать команду, то вы можете заранее набрать команду, которую хотите выполнить следующей. Вы можете вве- сти наперед сколько хотите данных (в разумных пределах). UNIX просто выбирает строки, которые вы подготовили, когда она готова их обработать. Так как вы можете заранее вводить данные даже в том случае, когда UNIX выполняет вывод, это также может служить примером двустороннего разговора. Оче- видно, вы будете заранее вводить данные только тогда, когда ближе познакомитесь с UNIX. Третий случай одновременного разговора — это когда вы предписываете UNIX выполнение в одно и то же время несколь- ких процессов. Пока вы разговариваете с одним процессом, дру- гой процесс может, напротив, посылать сообщения вам. Резуль- татом этого может оказаться путаница на экране дисплея; как бороться с такой анархией, мы расскажем в гл. 7. Характеристики терминала Мы сказали, что клавиши стирания, отмены и прерывания зави- сят от клавиатуры. Существует множество других характеристик терминала, касающихся устройств ввода (например, клавиату-
Гл. 5. Ввод и оболочка 61 ры) или вывода (например, дисплея). Они включают размер экрана, перемещения курсора и графические возможности. В не- которых реализациях UNIX имеется специальный файл, кото- рый описывает характеристики каждого типа терминала, свя- занного с системой. Используя эту информацию, программы спе- циального назначения, например графические, могут приспосаб- ливать свое поведение к типу используемого терминала, чтобы быть унифицированными насколько возможно. Однако иногда UNIX получает неверное представление о типе терминала, и если это случается, связь с пользователем в лучшем случае ис- кажается, а в худшем случае вообще отсутствует. Для разреше- ния таких затруднений обычно требуется помощь специалиста. Пользователи, однако, могут контролировать поведение свое- го терминала. Имеется команда stty, которую можно применять для таких целей, как, например, изменение клавиши стирания. Позднее в гл. 13 мы обсудим этот вопрос. Оболочка Предположим, что вы успешно освоили работу с терминалом, вошли в систему и уверены, что готовы вводить команды. Про- делав все это, вы можете быть потрясены, когда узнаете, что сама по себе система UNIX не анализирует вводимые вами коман- ды. Вместо этого UNIX окружена оболочкой, которая, подобно панцирю черепахи или раковине улитки, защищает ее от людей. Оболочка является вашим настоящим другом. Она преобра- зует вводимые вами команды во внутреннюю форму, которую понимают программы UNIX. В результате оболочка предостав- ляет мощный и удобный способ спецификации ваших команд. Другим потенциальным достоинством этой промежуточной оболочки является то, что каждый пользователь может иметь свою собственную оболочку. Ваша оболочка — это самая обыч- ная программа, которая переводит команды, вводимые вами с клавиатуры, во внутренний вид UNIX. На практике, однако, большинство пользователей используют одну и ту же оболочку, хотя некоторым второстепенным пользователям может быть предоставлена ограниченная оболочка, которая позволяет ис- пользовать лишь ограниченное число команд. В этой книге мы будем рассматривать только стандартную оболочку (хотя, точ- нее говоря, существуют различные варианты этого «стандарта»; мы поясним это в гл. 7). Независимость от устройств Обычно вывод из UNIX происходит на терминал. Это относится, например, ко всем случаям вывода информации в примере, при- веденном в гл. 1, таким как вывод списка файлов и текста пись-
62 Часть I. Идеи и концепции ма. В некоторых случаях может понадобиться выводить данные от одной из команд в файл, а не на терминал; тогда вы можете просмотреть этот файл через некоторое время. Например, если программа spell обнаружила сотню орфографических ошибок, вы можете сохранить эти ошибки в файле, чтобы заняться ими позднее, когда у вас появится пара свободных часов. Чтобы это сделать, вы добавляете к команде указание переадресовать вы- вод в желаемое место. О переадресации позаботится оболочка, а внутренняя часть UNIX фактически ничего не будет знать об этом. Аналогичный принцип применим для переадресации ввода. Переадресация осуществляется следующим образом. Кон- цептуально всегда существуют три файла: • стандартный ввод, • стандартный вывод, • стандартный вывод диагностики. Обычно все они соответствуют вашему терминалу. Таким обра- зом, концепция ввода-вывода в файл распространяется на ввод- вывод на терминал, так же как и в реальный файл в файловой системе. Очевидно, что файлы, соответствующие терминалам, не могут использоваться для хранения информации — она долж- на храниться в реальных файлах. По умолчанию каждая коман- да берет входные данные из файла стандартного ввода и посылает выходные данные в файл стандартного вывода — отсюда их на- звания. Когда вы переадресуете ввод или вывод, результатом является временное переопределение стандартного ввода и (или) стандартного вывода на что-либо другое, отличное от терминала. Переадресация обычно применяется к отдельной команде, но может применяться и к последовательности команд. Стандартный вывод диагностики важен в тех случаях, когда стандартный вывод переадресуется. Даже если вы переадресуе- те выходные данные в файл, вам все же хочется, чтобы сообще- ния об ошибках (например, сообщение о том, что вы ввели некор- ректную команду) выдавались на терминал. Вот почему име- ются два концептуально различных вида вывода. Стандартный вывод диагностики переадресуется не на терминал только при необычных обстоятельствах; такая переадресация равносильна заявлению: «Не сообщай мне, если что-либо происходит не так, сделай только запись об этом в некотором месте». Наряду с терминалом у вас могут быть другие устройства ввода-вывода, связанные с ЭВМ. В этом случае вы можете ис- пользовать механизм переадресации для обмена данными с ними. Мы подробнее расскажем об этом в гл. 13. Чаще всего, однако, таким устройством является устройство печати. Вывод на пе- чать обычно осуществляется посредством «спулинга», к описанию которого мы и переходим.
Гл. 5. Ввод и оболочка 63 Спулинг Предположим, что в вашей системе UNIX имеется печатающее устройство. Обычно оно разделяется между всеми пользователя- ми системы. Однако это не означает, что если другой пользова- тель начнет что-либо печатать, в то же время когда и вы исполь- зуете печатающее устройство, то оба текста перемешаются и вам придется ножницами вырезать свои части. Система UNIX поз- воляет избежать этого. Более того, UNIX даже не требует, чтобы вы ожидали за- вершения выдачи данных на печать, прежде чем начать делать что-либо еще. Вместо этого UNIX копирует весь текст, который должен быть напечатан в свой собственный специальный внут- ренний файл. Отдельные запросы на печать хранятся отдельно, чтобы не пришлось потом работать ножницами. Особый процесс печатает текст, который находится в упомянутом специальном внутреннем файле, но этот процесс работает как фоновый, пока пользователи занимаются своей обычной работой. Вы можете за- просить печать файла даже тогда, когда печатающее устройство временно не функционирует. UNIX просто сохранит текст, кото- рый надо напечатать, в своем внутреннем файле и распечатает его, когда печатающее устройство вновь станет доступным. Во всех случаях единственная задержка, которую видит поль- зователь за терминалом, когда он запрашивает вывод на печать,— это время, затрачиваемое системой на копирование соответствую- щего текста в ее внутренний файл. Обычно это время пользова- тель даже не замечает. Метод, который использует UNIX для осуществления этого волшебства, называется спулингом (от английского «spool», что означает Simultaneous Peripheral Operation On Line — одно- временный ввод-вывод в оперативном режиме, хотя это сокраще- ние вряд ли вносит большую ясность). Помимо печатающих устройство спулинг можно применять и к другим устройствам ввода-вывода. Его можно использовать и для приложений, та- ких как электронная почта в сети ЭВМ. Здесь спулинг играет роль почтового отделения, которое скапливает почту в отделе сортировки в течение нескольких дней, прежде чем что-либо с ней сделать, хотя, к счастью, эти задержки составляют секун- ды, а не дни. Конвейеры Теперь мы подходим к одному из наиболее изящных средств UNIX. Это средство ценно как для разработчиков, так и для пользователей программ UNIX. Мы начнем с проблемы, с кото- рой сталкивается разработчик программы, а затем перейдем
64 Часть I. Идеи и концепции к описанию метода, который помогает решить эту проблему. Это решение имеет одно чудесное свойство — оно облегчает ис- пользование всех программ UNIX независимо от того, являются ли они встроенными или написаны пользователями. Если вы создали программу, которой пользуются другие, то вы можете почувствовать себя героем. Однако в действительности вы далеки от того, чтобы быть героем, вас постоянно атакуют и изводят коварным оружием, которое называется НСЛОПЕ. Происхождение НСЛОПЕ связано с тем, что, как каждому из- вестно, программы вообще и ваша в частности не являются чем-то застывшим и их можно легко изменять. Поэтому всякий раз, когда один из пользователей вашей программы сталкивается с каким-либо ее недостатком или особенностью, которая не в его вкусе, он просит вас изменить соответственно вашу программу. Рассмотрим характерный пример. Предположим, что вы соб- ственноручно реализовали в UNIX программу с именем keats, которая берет в качестве входных данных скучнейшее прозаиче- ское произведение и превращает его в великолепную поэму. Вам кажется, что вы внесли свой вклад в мировую культуру, создав такую магическую программу, но не тут-то было. Один пользо- ватель говорит, что было бы хорошо, если бы строки поэмы мож- но было перенумеровать; другой утверждает, что было бы хорошо, если бы входная проза могла быть представлена в зашифрован- ном виде (чтобы пресечь плагиат), в то время как третий заявля- ет, что было бы прекрасно, если бы поэмы представлялись в фор- ме, удобной для наборного устройства. Теперь вы понимаете, что означает НСЛОПЕ: «Не Станет Ли Оно Прекрасней, Если..?». Если бы вы реализовали все НСЛОПЕ, ваша программа keats начала бы разбухать и становилась бы все более неудоб- ной для использования. Результатом таких упражнений являет- ся часто то, что программа, «улучшаемая» для удовлетворения все больших потребностей, в действительности становится все хуже. Разработчики программ UNIX сталкивались с этими НСЛОПЕ так же, как и все. Однако они нашли решение, которое позволило им сохранить принцип «чем меньше, тем лучше», но все же отразить НСЛОПЕ. Этим решением является конвейер (pipe). (Слово pipe (трубка) означает pipeline (буквально — трубопровод.— Перев.), а не противную трубку, которую неко- торые люди вкладывают в свои уста и разгоняют других, отрав- ляя атмосферу дымом.) Рис. 5.1 изображает конвейер, состоящий из двух программ. Здесь стандартный вывод из программы 1 служит стандарт- ным вводом для программы 2. Пользователь UNIX может со- брать в конвейер любые программы, какие только захочет. (Очевидно, эти программы должны иметь ввод и (или) вывод,
Гл. 5. Ввод и оболочка 65 чтобы их соединение имело смысл.) Пользователь программы keats может создать конвейер, изображенный на рис. 5.2. Входом для этого конвейера служит некоторая зашифрован- ная проза. Декодирующая программа преобразует ее в обычную ввод вывод Рис. 5.1. Вид конвейера. прозу и передает непосредственно программе keats, которая пре- образует ее в поэму — конечный продукт. Таким образом, дей- ствие конвейера в целом состоит в преобразовании зашифрован- ной прозы в поэтическое произведение. Разработчики UNIX по праву гордятся конвейерами, и их использование пронизывает всю философию разработки программ ввод вывод Рис. 5.2. Конвейер, декодирующий входные данные для keats. UNIX. Эту философию можно подытожить так: «Не пишите боль- ших и сложных программ. Вместо этого создавайте небольшие модульные компоненты, каждая из которых выполняет отдель- ную задачу и выполняет ее хорошо». Пользователь затем может связать вместе все эти модули любым желаемым способом для обеспечения необходимой ему функции. В приведенном примере программа keats хорошо разбирается в поэзии, но ничего не знает о кодировании. У декодирующей программы противопо- ложные свойства. Объединенные вместе в конвейере, они обес- печивают хорошее кодирование с хорошей поэзией. Конвейеры могут иметь какую угодно длину. В UNIX имеет- ся наборная программа troff, которую мы опишем позднее; ввод вывод Рис. 5.3. Конвейер, расширенный преобразованием вывода keats в дан- ные для наборного устройства. в отличие от программы keats, которая, к сожалению, лишь гипо- тетическая, программа troff — реальная программа системы UNIX, как, возможно, вы догадываетесь по ее крайне трудно запоминаемому имени. Программу troff можно добавить к нашему конвейеру, как показано на рис. 5.3. 3 № 161
66 Часть I. Идеи и концепции В этом конвейере входом является некоторая зашифрованная проза, а окончательным выходом — некоторая поэма, представ- ленная в виде, в котором ее можно передать в наборную машину. Если в вашей системе UNIX имеется программа, которая нумерует строки текста, ее также можно добавить к приведенно- му выше конвейеру, тем самым будут удовлетворены все требо- вания НСЛОПЕ, упомянутые выше. Конвейеры в UNIX настолько важны и полезны, что некото- рые программы разрабатываются в основном с целью использо- вания в качестве компонент конвейера, а не для самостоятельно- го использования. Такие программы называются фильтрами. Типичным фильтром служит программа, удаляющая из файла все пустые строки. Единственное реальное ограничение конвейеров состоит в том, что вы не можете построить сложную сеть, в которой не- сколько программ посылают данные одной программе. Пред- приниматели будут рады, однако, узнать, что вы можете создать конструкцию конвейера в форме Т-стыка; тем, кто этим интере- суется, следует обратиться к программе tee, описанной в доку- ментации UNIX. Средства программного обеспечения Если вы программист и желаете подробнее познакомиться с идеей построения программ из небольших модулей, то наилучший путь для этого — книги Kernighan, Plauger (1976), Software Tools. (Примеры, приведенные в указанной книге, написаны на языке RATFOR, являющемся расширением Фортрана. Если вы предпочитаете примеры на Паскале, то воспользуйтесь альтерна- тивным вариантом книги: Kernighan, Plauger (1981), Software Tools in Pascal. Какую бы книгу вы ни читали, идеи приме- нимы ко всем языкам программирования. Книга относится к одной из наиболее содержательных книг по ЭВМ и прекрасно написана. Необыкновенным для книги, написанной двумя авторами, является совершенное единство стиля и содержания. Чтобы дать вам представление об особенностях стиля, мы при- ведем следующую выдержку из введения книги. «Всякий раз, когда это возможно, мы будем строить более сложные программы из наиболее простых; всякий раз, когда это возможно, мы будем избегать вовсе построения программ, на- ходя новое применение уже существующим средствам, по отдель- ности или в комбинациях. Наши программы работают совместно; их совокупный эффект значительно выше, чем если бы вы имели простой набор программ, которые нельзя легко связывать друг с другом. К концу книги вы познакомитесь с набором средств,
Гл. 5. Ввод и оболочка 67 решающих многие из проблем, с которыми вы сталкиваетесь как программист.» UNIX —это отличная основа для реализации идей средств программного обеспечения, и действительно эти самые идеи про- низывают почти всю систему UNIX. Резюме На этом мы заканчиваем первую часть книги. Мы надеемся, что вы теперь хорошо подготовлены для усвоения практических основ UNIX, которые описаны во второй части, а затем сможете экс- периментировать с самой системой UNIX, уже понимая, что делаете. Некоторые люди учатся читая, другие — делая. Преуспеваю- щие делают и то и другое. Когда вы углубитесь в часть II, вам может понадобится вернуться вновь к части I. Мы надеемся, что обе части книги образуют единое целое: понимание концепций, даже при неполном усвоении, поможет вам овладеть практиче- скими основами, а практический опыт поможет лучше понять концепции.
ПРИЛОЖЕНИЕ ИДЕЙ ГЛАВА 6 ПРИМЕР СЕАНСА Когда я играю со своей кошкой, кто знает: я ли ее дрессирую, или она меня? Монтень Мы начнем эту часть книги с примера сеанса работы в UNIX. Вы можете избрать два альтернативных подхода к такого рода примерам. Первый подход предполагает просто их чтение подоб- но другим частям книги. Второй подход состоит в том, что вы входите в систему UNIX — мы предполагаем, что она находится в вашем распоряжении — и следуете примерам сеансов, воз- можно делая небольшие отклонения. Первый подход, вероятно, лучше, но это дело личного вкуса. Какой бы подход вы ни из- брали, важно на некоторой стадии провести исчерпывающий «ознакомительный» сеанс работы со своей системой UNIX — исследовать ее дерево, поэкспериментировать с ее механизмами защиты и испробовать ее команды. Возникает единственный
Гл. 6. Пример сеанса 6 вопрос, стоит ли следовать примерам или лучше дать волк своему собственному воображению. Вспомним, что системы UNIX отличаются друг от друга, хотя их принципы во многом схожи. Поэтому некоторые детали приведенных нами примеров могут отличаться в ваших реали- зациях. В основном это относится к формату выводимой инфор- мации. Даже подсказка, которую UNIX выводит на экран, когда она готова принимать команды, может в вашей системе представ- ляться знаком %, а не $. В приводимых примерах сеансов показано, что должно по- являться на терминале. Мы будем следовать соглашению, при- нятому в гл. 1: текст, вводимый пользователем, выделяется жирным шрифтом, чтобы отличить его от текста, выводимого системой UNIX. (Не волнуйтесь, если вы забыли подробности примера, приведенного в гл. 1; мы начнем все сначала.) Метод, которому мы будем следовать при разборе сеанса, состоит в том, что демонстрируется фрагмент сеанса, состоящий из небольшого числа команд, а затем, дается словесное объяснение того, что произошло в этом фрагменте. Затем переходим к следующему фрагменту. Начало очередного фрагмента указывается строкой вида: имя каталога Имя каталога — это имя вашего текущего каталога; оно указы- вается для того, чтобы напомнить вам место остановки преды- дущего фрагмента. Если на какой-либо стадии вы захотите вспомнить, что делает конкретная команда или более подробно узнать о ней, обратитесь к приложению Б. Работа начинается с входа в систему. UNIX выводит на дисп- лей приглашение «login:». Чтобы получить это приглашение, возможно, необходимо сначала «разбудить» ваш терминал. Де- лается это так же, как если бы вы будили человека — надо слегка дотронуться до него. Чтобы разбудить терминал, вы нажимаете на клавиши клавиатуры. Клавиши для побудки различны в раз- ных системах, но повторное нажатие клавиш пробел, BREAK (останов) или RETURN (возврат каретки) пробуждает от спячки многие системы. Прежде чем продолжить что-либо делать дальше, проверьте, установлен ли ваш терминал в режим нижнего регистра — мы, конечно, надеемся, что ваш терминал работает не только в режи- ме верхнего регистра 1(. Поэтому удостоверьтесь, что такие кла п В верхнем регистре печать производится прописными, а в ниж- нем — строчными буквами.— Прим. ред.
70 Часть II. Приложение идей виши, как SHIFT LOCK (блокировка сдвига) или ALPHA LOCK (блокировка алфавита), не включены. Система UNIX фанатично предана печати в режиме нижнего регистра; все ее команды и другие встроенные имена файлов составлены (почти) исключи- тельно из строчных букв. Для начала лучше всего следовать фа- натизму UNIX; позднее вы, возможно, сможете использовать в именах файлов прописные буквы. Содержимое ваших файлов, конечно, может включать и прописные, и строчные буквы — как вам больше нравится. Если вы вводите свое входное имя про- писными буквами, UNIX полагает, что ваш терминал работает только в режиме верхнего регистра и с этого момента ожидает, что вы будете вводить все данные прописными буквами. При входе в систему вы вводите входное имя и пароль. Когда вы вводите эти строки, так же как и любую другую строку в UNIX, не забывайте нажимать на клавишу возврата каретки в конце строки. На самом деле, как правило, если система UNIX как будто бы замирает, то, вероятнее всего, она еще ожи- дает нажатия клавиши возврата каретки. Вход в систему выглядит так: login: me {вход: me} Password: cleverme {Пароль: cleverme} Пароль, как мы надеемся, не будет выведен на экран. При входе в систему можно получить ряд сообщений и (или) почту. Обычное сообщение: кто-то просит кого-то удалить неко- торые из его файлов, поскольку память на постоянных дисках практически исчерпана. Сообщение может быть угрожающим: если пользователи не удалят свои собственные файлы, то это за них сделает суперпользователь. На сей раз мы можем посмеяться над угрозой суперпользователя, поскольку у нас еще нет ника- ких файлов. Затем UNIX выводит на дисплей командную подсказку и тем самым просит вас ввести команду. В наших примерных сеансах командной подсказкой является знак $. Керниган (Kernighan, 1978) написал прекрасную учебную книгу под заглавием UNIX for beginners (UNIX для начинаю- щих). В ней пользователь начинает с запроса у UNIX даты и, по-видимому, удовлетворившись, включается в работу по написанию некоторой книги. После пособия Кернигана почти все учебные сеансы работы в UNIX начинаются с того, что поль- зователь запрашивает дату, а позднее переходит к написанию своей книги. Мы продолжим эту прекрасную традицию. Наше первое действие поэтому будет состоять в использова- нии команды date (дата). После этого мы запросим список всех файлов текущего каталога при помощи команды Is. (Название к означает List Sorted (сортированный список) — имена упоря-
Гл. 6. Пример сеанса 71 доливаются в алфавитном порядке.) Когда мы входим в систему, текущим каталогом является наш личный каталог, который не содержит в себе файлов, так как до этого мы еще не использовали UNIX. Будем полагать, что имя нашего личного каталога /usr/me. /usr/me $ date Fri Nov 11 15:16:49 GMT 1983 $ Is $ Вы видите, что команда date в качестве поощрения выводит на дисплей не только дату, но и время. Обычно указывается местное время; в нашем случае — это среднее время по Гринвичу, что представляется буквами GMT (Greenwich Mean Time). Откровение Обратите внимание, что на команду 1s система UNIX ничего не ответила. Наш текущий каталог пуст, поэтому его содержимое — ничто. UNIX не говорит: «Ваш текущий каталог пуст, поэтому мне нечего выводить»; вместо этого система просто ничего не вы- водит, так как это как раз то, что мы просим. Теперь можно приоткрыть тайну: существовало еще третье лицо, кроме Томпсона и Ритчи, которое отвечало за первона- чальную разработку UNIX. Это отшельник, который делает все возможное, чтобы уклониться от общения с людьми. По- скольку он избегает гласности, то его вклад в UNIX не был за- мечен, но именно он разработал почти все части UNIX, выходя- щие на пользователя. Этот отшельник предпочитает, чтобы его называли (когда без этого нельзя обойтись) именем отшл. Молча- ливый ответ на команду 1s — это типичная работа отшл, так же как и само имя 1s — хотя отшл предпочел бы, чтобы команда имела имя из одной литеры, а не возмутительно длинное двух- буквенное имя; но его предложение было, к несчастью, отверг- нуто. Формат команд Общий вид команды UNIX состоит из имени команды, за кото- рым может следовать список из одного или нескольких аргу- ментов. Каждый аргумент представляет собой цепочку литер, которой предшествует пробел (или несколько пробелов и (или)
72 Часть II. Приложение идей табуляций, если вы действительно хотите сделать длинную команду). Примером команды с одним аргументом может быть ed jobletter798 Здесь аргумент jobletter798 определяет, какой файл должен редактироваться программой ed. Единственные команды date и 1s, которые мы до сих пор использовали в этой главе, не имели каких-либо аргументов, но вскоре мы приведем несколько при- меров команд с аргументами. В документации UNIX аргументы часто называются словами (words). Для того чтобы заставить UNIX что-либо сказать, когда мы в следующий раз выполним 1s, мы создадим несколько файлов. Это можно сделать с помощью команды cat. Чтобы вы могли иг- рать с cat, а не наоборот 1), мы посвятим некоторое время под- робному объяснению, как обращаться с ней — таким образом сделаем хозяином вас. Команда cat — это прекрасный пример экономичности UNIX в том смысле, что посредством одной команды перекры- вается широкий диапазон функций Это также пример экономии в смысле отшл при выборе имени команды: cat — сокращение от «concatenate» (конкатенировать, т. е. соединить вместе). Сле- довательно, команда cat может быть использована для объеди- нения большого числа файлов. Команда копирует каждый из этих файлов в стандартный вывод, оставляя без изменения исходные файлы. Как было сказано выше, стандартный вывод соответству- ет терминалу, если только не переадресован в другое место. Команду cat можно применять и для одиночного файла: в этом случае на выходе получается копия этого файла. По- этому команду cat можно использовать как команду копирова- ния файлов. Имя файла, который должен быть «конкатениро- ван», задается как аргумент команды cat. Например, команда cat х копирует файл х на терминал, т. е. выводит его на экран дисплея. Таким образом, общая команда, конкатенация файлов, служит также и для вывода на дисплей одиночного файла. На самом деле это самое частое использование команды cat. Команда cat имеет еще одно обобщение. Если вы не указали ни одного файла для конкатенации, т. е. просто набрали cat 1> Напомним, что буквально в переводе с английского cat озна- чает «кошка».— Прим, перев.
Гл. б. Пример сеанса 73 то UNIX считает, что «файл» должен быть взят из стандартного ввода, т. е. опять с терминала. Результатом применения такой минимальной формы записи команды cat будет ввод строк с тер- минала и копирование их назад на терминал. (Из-за своей при- хоти команда cat в этом случае не выполняет вывод, пока не вве- дет достаточно большую порцию исходных данных. Так, она не выводит строку сразу же, как только эта строка введена.) Резюмируя поведение команды cat, можно отметить: (1) cat сама по себе просто копирует информацию, вводимую с терминала, обратно на терминал; (2) cat с одним файлом копирует этот файл; (3) cat с несколькими файлами делает копию, состоящую из всех этих файлов, соединенных вместе. (4) по умолчанию результат выводится на терминал, но вы мо- жете переадресовать его в файл. В нашем примерном сеансе мы начнем с изучения случая (1) — он хотя и не очень полезен, но является основой. Для того чтобы нам не пришлось вводить данные бесконечно, необ- ходим какой-то признак, указывающий на конец ввода. (Можно было бы использовать клавишу останова, но она должна быть зарезервирована для экстренного останова в критической ситуа- ции, а не для нормального запланированного останова.) В UNIX вы указываете на окончание ввода, нажимаяДс1 (букву d при нажатой клавише CONTROL) /usr/me $ cat Я ненавижу попугаев Я больше с тобой не разговариваю Ad Я ненавижу попугаев Я больше с тобой не разговариваю $ Обычно Ad не отображается на экране дисплея, хотя в некоторых системах UNIX вместо этого выводится что-либо типа (EOF), означающее конец файла (End of File). Взгляните на вторую, третью и четвертую строки приведен- ного выше фрагмента. Вы увидите, что UNIX для этих строк — ввода для команды cat — не выдавала никакой подсказки. Та- кое молчание является обычным режимом работы UNIX, когда она запрашивает данные со стандартного ввода, однако это мо- жет дезориентировать начинающих.
74 Ч асть II. Приложение идей Теперь давайте сделаем что-либо более полезное, переадресо- вав вывод от cat в файл. Для этого запишем знак >, за которым (можно без пробела) укажем имя создаваемого файла /usr/me $ cat > scores Саутгемптон 9 Тоттнем 0 ВЦ Юникента A d $ cat scores 6 Все остальные 1 Саутгемптон 9 Тоттнем 0 ВЦ Юникента $ 6 Все остальные 1 Здесь первое использование cat все еще относится к случаю (1), но с выводом, переадресованным в файл scores (счет). Второе использование cat относится к случаю (2); команда cat в этом случае выводит на дисплей файл scores, который мы только что создали. Теперь создадим еще один файл, начало боевика-бестселлера, который мы пишем. /usr/me $ cat >bestseller Грег Деймлер вошел в комнату. На полу валялось десять трупов. Он кашлянул. Один труп свалился с книжного шкафа. Грег посмотрел вверх. Он увидел еще семь трупов, пригвожденных к потолку. A d $ Просим извинить за остановку, как раз в тот момент, когда ваше внимание приковано к детективу, но вы не вправе ожидать, что получите две книги за те же деньги. Если мы наберем теперь команду 1s, то ей будет что сообщить нам. /usr/me $ Is bestseller scores $
Гл. 6. Пример сеанса 75 В вашей конкретной системе UNIX формат листинга имен файлов может отличаться от приведенного выше. В частности, каждое имя файла внутри каталога может быть выведено на дисплей отдельной строкой, например $ 1s bestseller scores $ Раз уже файлы созданы, то, если только вы их явно не унич- тожите, они будут существовать, пока жива ваша система UNIX — по крайней мере так должно быть. В частности, если вы теперь выйдете из системы и снова войдете в нее через месяц или даже через год, то команда 1s все еще выдаст приведенный выше результат. Прежде чем перейти к следующему разделу, закончим изуче- ние команды cat, доставив ей редкое удовольствие действительно сконкатенировать что-то. /usr/me $ cat scores bestseller Саутгемптон 9 Тоттнем О ВЦ Юникента 6 Все остальные 1 Грег Деймлер вошел в комнату. На полу валялось десять трупов. Он кашлянул. Один труп свалился с книжного шкафа. Грег посмотрел вверх. Он увидел еще семь трупов, пригвожденных к потолку. $ Опции При использовании команды 1s мы не задавали ей никаких ар- гументов. Однако эта команда может иметь аргументы. В ча- стности, аргумент —1 означает, что вы хотите получить более подробную информацию о файлах каталога. Аргумент, начи- нающийся со знака минус, называется опцией. Опции заставля- ют команду выполняться не так как обычно; мы обсудим это позднее в данной главе. Для команды 1s опция дает вам допол- нительную информацию о каждом файле в каталоге.
76 Часть II. Приложение идей /usr/me $ Is —I total 2 —rw—г-------г----1 me 186 Nov 11 15:25 bestseller —rw—r-------r----1 me 076 Nov 11 15:22 scores $ Как видите, здесь много информации. Первая выводимая командой 1s строка указывает общее количество единиц памяти (они называются блоками), занимаемыми нашими файлами. По- скольку наши файлы небольшие, каждый из них занимает по одному блоку и поэтому их общее число равно 2 (total 2) Осталь- ные строки листинга содержат информацию о каждом из фай- лов bestseller и scores. Мы рассмотрим первую из них. Строка о файле bestseller начинается с десятилитерной це- почки — rw — г — — г------- Эти цепочки информируют вас о полномочиях, связанных с фай- лами bestseller. Знак минус внутри цепочки указывает на «за- прет». Первая литера цепочки имеет специальное назначение: если здесь указана буква d, то файл является каталогом. По- скольку ни один из наших файлов не является каталогом, то в обоих случаях в первой позиции стоит знак минус. Остальные девять литер подразделяются на три группы. Первая тройка указывает полномочия для владельца файла. г означает, что разрешается читать файл; w означает, что разрешается писать в файл; х означает, что разрешается выполнять файл. Следовательно, мы можем читать bestseller и писать в него, но не можем его выполнять. (Было бы нелепо выполнять этот файл, поскольку он не является выполнимым файлом.) Следую- щие три литеры, т. е. буква г и два знака минус, указывают полномочия для членов группы, а последние три литеры, также содержащие г и два знака минус, указывают полнчмочия, при- писанные всем остальным. Таким образом, полный анализ дан- ной 10-литерной цепочки выглядит так: — файл не является каталогом; г владелец может читать файл; w владелец может писать в файл; — владелец не может выполнять файл; г другие члены группы владельца файла могут читать файл;
Гл. 6. Пример сеанса 77 — другие члены группы владельца файла не могут писать в файл; — другие члены группы владельца файла не могут выпол- нять файл; г не члены группы владельца файла могут читать файл; — не члены группы владельца файла не могут писать в файл. — не члены группы владельца не могут выполнять файл Эти полномочия, которые являются исходными при создании файла, фиксируются самой системой UNIX. Ваша система UNIX может отличаться от нашей, но вышеприведенные полно- мочия вполне разумны, хотя, возможно, и обеспечивают чрез- мерную защиту. Следующий элемент информации о файле bestseller — циф- ра 1. Это «число ссылок» — понятие, о котором мы поговорим болге обстоятельно позднее в этой главе; грубо говоря, оно озна- чает количество имен файлов, которые являются синонимами данному имени файла. Так как bestseller — самостоятельный файл подобно большинству файлов, то число ссылок равно 1. За «1» следует владелец файла. Поскольку мы создали файл, то мы и являемся его законным владельцем. В своем каталоге вы можете иметь файлы, владельцами которых являются другие пользователи. Эти файлы как бы одолжены вам. За владельцем следует размер файла в литерах. Вы можете проверить число 186, собственноручно пересчитав литеры — не забудьте при этом учесть литеры новой строки в конце каж- дой строчки. Последнее поле в листинге содержит время, показывающее, когда последний раз изменялся файл. «Кроме —1 в моей системе UNIX имеется 17 других альтерна- тивных опций для команды 1s»,— сказал Дадли. «Если вы инте- ресуетесь индексными номерами ваших файлов, то можете...». Анализ дерева Команду 1s можно использовать для просмотра каталогов, от- личных от текущего. Для этого в качестве аргумента вы указы- ваете имя каталога; если имя каталога в качестве аргумента не за- дано, как в ранее рассмотренном примере использования 1s, то предполагается текущий каталог. Каталог самой верхней части дерева, корневой каталог root, имеет очень простое имя — косая черта /.
78 Часть 11. Приложение идей /usr/me $ Is / bin dev etc lib mbox usr $ Команда Is / выводит имена файлов, содержащихся в каталоге root. Напомним два момента: во-первых, каждому аргументу должен предшествовать пробел, поэтому должен быть пробел между 1s и знаком /, следующим за 1s; во-вторых, содержимое корневого каталога root различно в разных системах UNIX, поэтому то, что выводится на дисплей в вашей системе UNIX, может отличаться в деталях от вышеприведенного. Связь опций с другими аргументами Мы рассмотрели два возможных вида аргументов команды 1s: Is —1 выводит подробную информацию о файле; 1s имя каталога выводит содержимое каталога, отличного от текущего. В общем случае может возникнуть двусмысленность при исполь- зовании указанных видов аргументов, и UNIX не сможет устано- вить, представляет ли данный аргумент имя каталога или нет. UNIX решает эту проблему при помощи правила, согласно ко- торому аргументы, представляющие собой опции, должны на- чинаться со знака минус. Так —1 определяет опцию «подробный листинг». Ранее мы рекомендовали вам составлять имена файлов из букв и цифр. Несомненно, вы не всегда будете следовать этому правилу, но все же никогда не начинайте имя файла со знака минус. Если бы вы назвали каталог именем —1, то он оказался бы не отличимым от опции —1. Среди других опций 1s, упомянутых Дадли: а выводит список всех файлов в каталоге; этот список включает некоторые обычно скрытые файлы, используемые самой системой UNIX; г изменяет порядок сортировки списка на противоположный. Вы можете задать последовательность из указанных букв в своем списке опций; например, —air будет запрашивать все три упомянутые нами опции. (Порядок, в соответствии с которым вы записываете опции, не имеет значения; так —ral означает то же самое, что и —lar.) Обычно аргументы, представляющие собой опции, указывают- ся раньше тех аргументов, которые не являются опциями.
Гл. 6. Пример сеанса 79 Использование опций показано ниже. /usr/me $ Is —lr total 2 —rw—г г— — 1 me 076 Nov 11 15:22 scores —rw—г г $ 1s —г / usr mbox lib 1 me etc dev 186 bin Nov 11 15:22 bestseller $ Изменение полномочий Легко изменить полномочия, связанные с файлами. Предполо- жим, что мы хотим сделать наш файл scores доступным для чте- ния и записи членам нашей группы, но абсолютно недоступным всем остальным пользователям. Это осуществляется с помощью команды chmod. Chmod имеет два (или более) аргументов: пер- вый аргумент состоит из последовательности цифр; остальные аргументы задают имена файлов, которым должны быть приписа- ны новые полномочия. Три цифры в первом аргументе соответ- ствуют трем типам пользователей: первая цифра описывает владельца, вторая цифра описывает группу, третья цифра описывает всех остальных. Каждая цифра составляется путем сложения чисел 4 разрешение читать, 2 разрешение писать, 1 разрешение выполнять. Так, если первая цифра 6, это означает, что владелец файла имеет разрешение читать и писать /usr/me $ chmod 660 scores $ Is —1 total 2 —rw—r-------r------1 me 186 Nov 11 15:25 bestseller —-rw—rw------------1 me 076 Nov 11 15:22 scores $ Вы видите, как изменились полномочия для файла scores.
80 Часть II. Приложение идей Может быть, вы находите, что задавать числовые аргументы в команде chmod не совсем удобно. Если так, то обратитесь к до- кументации по UNIX, и вы обнаружите, что есть другой, путь задания этого аргумента. Однако довольно спорно, является ли это символьное представление намного лучше, чем непривлека- тельное цифровое представление. Понимание числовой записи имеет то единственное преимущество, что такие числа могут по- являться в некоторых сообщениях об ошибках, выдаваемых си- стемой UNIX. Создание каталога С нашим детективом не все в порядке. Погрешность, разумеется, не в тексте, а в способе организации (j айлов. Так как сам роман в конце концов превратится, вероятно, в длинный файл, то намного лучше предусмотреть его разделе- ние на отдельные файлы. Естественной единицей может служить глава. В каждый момент времени мы будем работать над одной главой и при этом захотим выполнять такие операции, как пе- чать текста или проверка правописания слов применительно к каждой главе, которую мы заканчиваем, а не применительно к тесту всего романа. Поэтому мы поместим каждую главу в от- дельный файл. Учитывая, что роман будет состоять из большого числа раз- личных файлов, крайне желательно создать отдельный каталог для этих файлов, а не мешать их со всеми другими нашими фай- лами. Для этого воспользуемся командой mkdir. Аргументом для mkdir служит имя нового каталога, который вы хотите завести. usr/me $ mkdir novel $ Is —1 total 3 —rw—r----r-----1 me drwxr—xr—x 2 me —rw—rw---------1 me $ 186 Nov II 032 Nov 11 076 Nov 11 15:25 bestseller 15:39 novel 15:22 scores Обратите внимание, что в листинге файлов строка, относящая- ся к novel, начинается с буквы d, означающей, что это каталог. Связанные с novel разрешения позволяют любому пользователю выполнять его, что показано появлением букв х. Напомним, что выполнение каталога означает использование этого каталога для
Гл. 6. Пример сеанса 81 доступа к файлам, находящимся в нем. Хороший способ запом- нить это — знать, что буква х представляет собой разрешение выполнить (eXecute), или применительно к каталогу — разре- шение на доступ (aXess) к файлам в этом каталоге. Каталоги бесполезны без разрешения на выполнение, и поэтому mkdir автоматически устанавливает полномочие на выполнение для каждого каталога, который она создает. (Может быть, вы заметили, что поле «число ссылок» для ката- лога равно 2. Вам не следует детально касаться этого. Дадли скажет вам, что поле «число ссылок» для каталога имеет значение на два больше, чем число подкаталогов, содержащихся в этом каталоге; так как каталог novel (роман) не содержит каких-либо подкаталогов — в данный момент он абсолютно пуст,— то число ссылок для него равно 2.) Хотя мы только что создали новый каталог, текущий каталог не изменился. Текущим каталогом все еще является личный ка- талог, в котором мы работали с того момента, как вошли в систе- му. Можно вывести на дисплей полное имя текущего каталога с помощью команды pwd — это термин отшл, означающий рас- печатать рабочий (т. е. текущий) каталог (Print Working Direc- tory). Чтобы изменить текущий каталог, мы используем команду cd, задав в качестве ее аргумента имя нового текущего каталога, в котором мы хотим работать /usr/me $ pwd /usr/me $ cd novel $ pwd /usr/me/novel $ cat > introduction Всякое сходство между персоналами этой книги и реальными людьми абсолютно случайно. Мне хочется поблагодарить мою жену Хедер за контрольное чтение рукписи. Ad $ Is introduction $ spell introduction рукписи $ Здесь мы дважды использовали pwd, чтобы показать, как сме- нился наш текущий каталог: сначала текущим был наш личный
82 Часть II. Приложение идей каталог, а потом им стал подкаталог novel. Изменив текущий каталог на novel, мы создали внутри него файл под именем introduction (введение). Командой 1s мы распечатали содержимое текущего каталога. Наконец, мы использовали не раз упоми- навшуюся выше программу spell для проверки правописания применительно к нашему новому файлу. Она выдала одно оши- бочно написанное слово «рукписи». При этом программа не об- наружила неуместность слова «персоналами», что показывает, root bestseller novel scores introduction Рис. 6.1. Структура части дерева, связанной с пользователем те. насколько глупо возлагать слишком много надежд на программы коррекции ошибок правописания. Древовидная структура нашей части файловой системы будет теперь иметь следующий вид (рис. 6.1). Теперь, когда мы реорганизовали нашу файловую структуру, мы можем переслать файл bestseller в новый каталог novel и пере- именовать его в chapter 1 (глава!). Чтобы это сделать, необходимо углубить наши познания, поскольку файл bestseller располагается вне текущего каталога novel. Маршрутные имена файлов Мы уже объяснили, что маршрутное имя файла — это средство, которое можно использовать для обращения к любому файлу в файловой системе. Маршрутное имя файла bestseller пред- ставляется как /usr/me/bestseller Это имя не зависит от текущего каталога. Маршрут начинается с корня дерева (root), на что указывает первый знак «/», Как част- ный случай такой формы записи маршрутное имя, состоящее из одного знака «/», представляет корневой каталог; именно по- этому использовавшаяся выше команда Is / обеспечивала выдачу листинга корневого каталога.
Гл. 6. Пример сеанса 83 Маршрутные имена, начинающиеся с корня, в больших фай- ловых системах могут стать чрезмерно длинными, поэтому UNIX предлагает второй способ задания маршрутных имен. Он состоит в том, что маршрут начинается не с корня, а с теку- щего каталога. Если вы не укажете «/» в начале маршрутного имени, то это будет означать, что используется второй способ. В приведенной ниже таблице показаны некоторые примеры марш- рутных имен для файла introduction в случае различных теку- щих каталогов. Не забывайте, что вы можете сменить текущий каталог на любой каталог в файловой системе (как всегда при условии, что вы имеете соответствующее разрешение). Анало- гично, другие пользователи могут сделать своим текущим любой из ваших каталогов. Текущий каталог Маршрутное имя файла introduction novel introduction me novel/int reduction usr me/novel/int reduction root usr/me/novel/introduction Во всех этих примерах маршрут проходит вниз по дереву от текущего каталога к файлу (т. е. удаляясь от корня). Однако мы прервали наш примерный сеанс в тот момент, когда текущим каталогом был каталог novel, а мы хотим обратиться к файлу bestseller, маршрут к которому проходит вверх по дереву от те- кущего каталога. Это можно сделать, используя специальное имя, которое система UNIX заводит в каждом создаваемом ей каталоге: это имя «..», и оно ссылается на родительский (т. е. на вышестоящий по отношению к текущему) каталог. Так, если текущим катало- гом является novel, то на файл bestseller можно ссылаться как ../bestseller Такая запись короче и более удобна, чем использование полного маршрутного имени файла, начинающегося с корня. Вы можете расширить эту форму записи «..», но не с помощью большего числа точек, как вы, может быть, ожидаете Если вы хотите подняться вверх на два уровня, т. е. сослаться на файл в каталоге usr, то это можно сделать так: ..1..1имя-файла В качестве примера нелепого маршрутного имени можно ука- зать ../.,/me/novel/introduction
84 Часть II. Приложение идей Это равносильно introduction, так как вначале вы поднимаетесь на два уровня вверх, а затем спускаетесь назад в текущий ката- лог. В любом месте, где вы указываете имя файла в качестве аргу- мента, например при использовании команды cat, вы можете задать вместо него маршрутное имя файла. Таким образом, все команды UNIX, которые работают с файлами, могут работать с любым файлом, к которому вы имеете доступ, во всей файловой системе. Пересылка файлов Команда mv будет пересылать файл с одного на другое место. Эта команда не эквивалентна копированию файла, так как при ее выполнении исходный файл разрушается; она больше похожа на переименование файла. (Точнее говоря, команда mv эквива- лентна переименованию файла, если только новое имя файла не находится в файловой системе, отличной от исходной; в послед- нем довольно редком случае делается новая копия файла.) Первый аргумент в mv задает исходное имя существующего файла, а второй — новое имя файла. Мы можем воспользоваться командой mv для пересылки файла bestseller в наш текущий каталог novel. usr/me/novel $ mv ../bestseller chapterl $ Is —1 total 2 —rw—r-------г------1 me 186 Nov 11 15:25 chapterl —rw—r-------r------1 me 156 Nov 11 15:41 introduction $ Is .. novel scores $ При пересылке файла связанные с ним полномочия остаются не- изменными. Обратите внимание на вторую команду 1s. Она вы- водит листинг нашего личного каталога, так как запись .. озна- чает родителя текущего каталога. Вы видите, что файла bestseller в этом каталоге больше нет. Копирование файлов Команда ср подобна mv, за исключением того, что она действи- тельно копирует файлы. (Это же можно делать с помощью коман- ды cat, но ср может быть более удобна.) Так, если наш приятель
Гл. 6. Пример сеанса 85 арег хочет скопировать наш файл introduction в свой личный каталог, то он может набрать ср ../me/novel/introduction begining Теперь он располагает файлом beginning (начало), который яв- ляется независимой копией нашего файла introduction. Точно так же как вы читаете файлы, размещенные вне теку- щего каталога, вы можете и писать в них. Так, мы можем создать файл morescores в личном каталоге путем /usr/me/novel $ cat >../morescores Сомерсет 650 (Ботчард 310) Кент 246 (Таваре 61) Ad $ Уничтожение файлов До сих пор в примерном сеансе мы, начав с нуля, только создава- ли файлы. Теперь настало время поговорить об их уничтожении. Существуют два способа уничтожения содержимого файла. Первый — записать другие данные вместо предыдущего содержа- ния; в этом случае сам файл по-прежнему существует, но его содержимое уже другое. Второй способ — уничтожить файл совсем, так чтобы его имя исчезло из каталога. В обоих случаях исходное содержание файла навсегда теряется. Команды UNIX ведут себя по-разному по отношению к за- писи в уже существующий файл. Это их поведение зависит от реализации системы UNIX, а также может зависеть от индиви- дуальных входных файлов пользователей (см. ниже). В нашей системе, например, когда вы используете команду ср для копи- рования в существующий файл, предыдущее содержимое этого файла затирается без всяких церемоний. С другой стороны, если вы переадресуете вывод в существующий файл (скажем, с по- мощью команды cat), то UNIX отказывается перезаписывать этот файл. Вам придется вначале явно уничтожить этот файл. Коман- ды, которые ведут себя как ср, благотворствуют Великому вре- дителю. Если вы делаете запись в файл, который, как вы счи- таете, является новым, а на самом деле уже существует, то со- держимое этого файла теряется. Чтобы уничтожить файл совсем, используется команда гт; в качестве аргументов указываются имена уничтожаемых фай- лов. Во всех случаях работы с ЭВМ вы постоянно будете созда-
86 Часть II. Приложение идей вать новые файлы. Если вы не будете регулярно их уничтожать, то будете находиться во все более нестабильном состоянии и не- избежно потерпите крах из-за ограничений размера файлового пространства. В любой стабильной системе UNIX все ее поль- зователи должны также часто уничтожать файлы, как и созда- вать их. Давайте прислушаемся к голосу общественности и уничто- жим наш файл morescores. (Прежде чем это сделать, поясним, что этот файл содержит счет игры в гольф; ни один читатель, конечно, не так глуп, чтобы думать, что крикетный матч может закончиться для Кента с таким разгромным счетом.) /usr/me/novel $ Is .. morescores novel scores $ rm ../morescores $ Is .. novel scores $ Вы видите, что после выполнения rm файл morescores исчез. Вы также можете обратить внимание на то, что, хотя текущим каталогом является novel, мы вполне свободно можем работать и с файлами в другом каталоге; в данном случае мы работаем в родительском каталоге, используя запись «..». В этот момент наши осведомители сообщают нам, что арег взял копию нашего файла introduction и назвал его beginning. Мы решаем уничтожить эту копию. Чтобы это осуществить, мы можем сделать своим текущим каталогом его личный каталог, отыскать, где находится файл beginning, и уничтожить эту ко- пию нашего введения. /usr/me/novel $ cd /usr/арег $ Is — 1 total 3 —rw—rw—rw— 1 aper 156 Nov 11 15:18 beginning —rwxr-----r-----1 aper 343 Aug 13 12:18 end —rwxr-----r-----1 aper 377 Oct 30 17:58 middle $ rm beginning rm: /usr/aper/beginning не удален $
Гл. 6. Пример сеанса 87 Когда мы использовали команду rm, UNIX ответила сообще- нием об ошибке, в котором говорится, что наша атака отбита (файл не удален). Защитное оружие, которое предусмотрел aper, состояло в том, что нам отказано в разрешении писать в его каталог; прежде чем уничтожать файл, необходимо изменить каталог, поэтому наша попытка уничтожения не удалась. Обра- тите внимание, что UNIX использует полное маршрутное имя при ссылке на файл в сообщении об ошибке. Однако мы не полностью потерпели поражение. Aper уговорил одного своего друга помочь ему улучшить наше введение и, чтобы этот друг мог работать с файлом beginning, установил для этого файла полномочия, позволяющие всем в него писать. Мы можем воспользоваться этой лазейкой. При условии, что у нас есть разрешение писать в файл beginning, мы можем ско- пировать все, что захотим, на место предыдущего содержимого файла. /usr/aper $ ср /usr/me/scores beginning $ cat beginning Саутгемптон 9 Тоттнем О ВЦ Юникента 6 Все остальные 1 $ Тем самым мы уничтожили содержимое beginning, записав вместо него содержимое scores. Теперь, после успешного набега, можно ретироваться /usr/aper $ cd /usr/me $ Мы вновь вернулись в наш личный каталог. (Аналогичного эф- фекта можно было бы достичь, просто набрав команду cd Если аргумент в cd не задан, то это означает, что вы хотите вер- нуться в свой личный каталог.) Хотя каталоги являются файлами, вы не можете использо- вать rm для уничтожения каталога (если только вы не восполь- зуетесь специальной опцией). Вместо этого используйте команду rmdir. Каталог должен быть пуст перед тем, как вы его уничтожи- те.
88 Часть II. Приложение идей Прежде чем закончить обсуждение команды rm, мы должны вновь подчеркнуть ранее высказанное предупреждение: когда вы уничтожаете файл, он теряется навсегда, поэтому будьте осторожны. Было бы самой скверной шуткой сказать начинаю- щему пользователю UNIX, что rm означает really mandatory (действительно нужный) и служит для указания системе на то, что следует обрабатывать файл предельно осторожно Создание ссылок Предположим, что другой автор, dickens (диккенс), оценив изя- щество нашего произведения, желает, чтобы мы помогли ему в его работе. В частности, он хочет, чтобы мы стали соавтором пятой главы (файл chapter5) его книги olvrtwst (олвртвст), ново- го романа, написанного в стиле UNIX. Мы согласились, что оба соавтора могут писать в файл chapters внутри каталога olvrtwst, принадлежащего dickens, поэтому он дает нам (как члену своей группы) разрешение писать в этот файл. Мы можем ссылаться на файл chapters, используя маршрут- ное имя. Однако этот способ несколько громоздкий и, если мы собираемся обращаться к этому файлу много раз, гораздо удобнее иметь для него синоним. Для этого мы воспользуемся механиз- мом ссылок. В системе UNIX можно связать с одним и тем же действительным файлом произвольное число имен файлов (ссы- лок), даже принадлежавших разным пользователям 1(; в этом случае все эти имена являются синонимами. Мы решаем использовать имя withdickens (с диккенсом) в качестве синонима для chapters романа dickens. Для создания ссылок используется команда In. /usr/me $ in /usr/dickens/olvrtwst/chapter5 withdickens $ Is—1 total 12 drwxr—хг—х 2 me 64 Nov 11 —rw—rw 1 me 76 Nov 11 —rw—rw — 2 dickens 4766 Aug 25 $ 16:04 novel 15:22 scores ' 13:33 withdickens 11 Имя файла (ссылка) принадлежит пользователю, Еится в его каталоге.— Прим. ред. если оно хра-
Гл. 6. Пример сеанса 89 Обратите внимание, что общее число блоков памяти стало теперь равно 12. Это произошло потому, что withdickens — относитель- но длинный файл (4766 байт) и занимает в нашей системе UNIX десять 512-байтовых блоков. Строка о файле withdickens в листинге демонстрирует ряд интересных свойств. Во-первых, владельцем файла является dickens, а не мы, и всеми полномочиями управляет он; он раз- решил писать в файл членам своей группы, поэтому все в по- рядке. Во-вторых, число ссылок теперь равно двум. (Все поль- зователи, имеющие ссылку на некоторый файл, видят его оди- наковым образом — действительно, они могут видеть только один и тот же файл. Так, если бы dickens выполнил команду Is, он увидел бы строку, идентичную нашей строке для with- dickens, только с той разницей, что именем файла в ней было бы chapter5.) Поле «число ссылок» дает еще одно преимущество, которое делает механизм ссылок более удобным, чем просто аппарат си- нонимов. Ссылки служат средством защиты в ситуации, когда один из пользователей уничтожает общий файл и тем самым рас- страивает работу других пользователей. На самом деле команда rm не уничтожает файл, а уничтожает ссылку на него, т. е. вы- полняет операцию, обратную созданию ссылки. Только если после уничтожения ссылки число ссылок стало равным нулю, файл действительно исчезает. Предположим, что dickens либо намеренно, находясь в со- стоянии депрессии, либо ненамеренно как результат действия в нем самом Великого вредителя, удаляет файл chapters. Мы не теряем при этом файла withdickens. Единственное изменение, которое мы можем заметить,— число ссылок у этого файла сни- зилось до одной. Поэтому файлы, на которые мы создали ссылки, можно считать абсолютно такими же, как все остальные наши файлы. (С единственной оговоркой: если вы не являетесь вла- дельцем файла, то не можете изменить приданные ему полномо- чия. В нашем примере, если мы хотим, чтобы полномочия были изменены, мы должны уговорить пользователя dickens, который еще владеет файлом, несмотря на то что он его удалил, чтобы он вновь создал ссылку на этот файл и сделал изменения; имеется и другой способ: мы можем скопировать файл таким образом, что станем владеть копией.) Существуют два ограничения на создание ссылок. Первое состоит в том, что, хотя в большинстве систем UNIX каталог обрабатывается как обыкновенный файл, нельзя создавать ссылку на оглавление. Так, мы не смогли бы создать ссылку на olvrtwst. Второе ограничение состоит в том, что нельзя создавать ссылку на файл, находящийся в другой файловой системе. («Все это связано с индексными номерами, которые...», сказал Дадли.)
90 Часть II. Приложение идей Одновременная запись В системе UNIX можно читать файл, в который в это же самое время кто-нибудь другой осуществляет запись. Это вполне есте- ственно для каталогов. Например, в любой момент вы можете читать каталог usr и может так случиться, что в тот момент, когда вы его читаете, в него добавляется новый пользователь. UNIX позаботится об этом без излишней суеты. В некоторый момент во время чтения файла, в который пишет кто-либо другой, вы переключитесь со старой версии на новую. В большинстве слу- чаев это переключение пройдет для вас незаметно, если только тот, кто пишет, не изменит файл коренным образом, например заменит таблицу первенства по футболу на стихотворение Джона Мильтона. Разрешается также запись в файл несколькими пользовате- лями одновременно. Однако в рассмотренном примере с фай- лом withdickens было бы желательно иметь некоторое нефор- мальное соглашение с пользователем dickens, чтобы предупре- дить анархию. Борьба с Великим вредителем Мы закончим примерный сеанс демонстрацией двух возможностей, которые обсуждались в гл. 3 и 4 при изучении файлов. Первая касается вывода на дисплей двоичных файлов. Если бы мы на- брали cat novel то получили бы на терминале странный вывод. Это происходит потому, что novel является файлом-каталогом и фактически смесью текстовой (имена файлов) и двоичной информации о каждом файле. Результирующий вывод, который мы не приве- ли выше, так как он сильно отличается для разных терминалов, оказался бы смесью имен файлов и случайных литер — озада- чивающий конгломерат, если не понимать, в чем дело. Вторая и более важная возможность, которую мы продемон- стрируем, это отказ самим себе в разрешении писать в собствен- ные файлы /usr/me $ cd novel $ chmod 440 introduction $ Is — 1 total 2
Гл. 6. Пример сеанса 91 —rw—г-------г------I me 186 Nov 11 15:25 chapterl —г------г-------------1 те 156 Nov 11 15:41 introduction $ Вы видите, что теперь ни мы, ни кто-либо еще не имеет разреше- ния писать в файл introduction. Если нам действительно необ- ходимо писать в файл introduction, мы можем изменить его пол- номочия и вновь разрешить запись, но текущие полномочия предохраняют от случайностей. Внезапно появляется Великий вредитель и пытается пере- записать, а затем удалить с помощью rm файл introduction /usr/me/novel $ ср ../scores introduction ср: не могут создать /usr/me/novel/introduction $ rm introduction rm: проигнорировать защиту 440 для introduction? n $ Is chapterl introduction $ Система UNIX не позволила Великому вредителю копировать в существующий файл. Когда он попытался выполнить команду rm, UNIX предоставила нам второй шанс. Наше лучшее я взяло верх и мы набрали п (нет), чтобы не удалить файл. Великий вре- дитель потерпел поражение, как вы видите из вышеприведенного листинга, который показывает, что файл introduction все еще существует. Довольные успехами, мы выходим из системы. /usr/me/novel $ Ad $ Использовать Ad для выхода из системы не совсем удобно: вы можете ввести эту литеру случайно, будучи уверены, что вам нужно завершить некоторые данные. Поэтому в некоторых реа- лизациях UNIX вместо этого есть явные команды для выхода из системы, например logout. Важно выйти из системы, прежде чем вы покинете свой тер- минал. Если вы этого не сделаете, то
92 Часть II. Приложение идей • вам могут начислять плату за время, в течение которого вы «используете» систему; • кто-нибудь другой, кто сядет за ваш терминал, не нуждается во входе в систему. С этого терминала вошли в систему вы, и поэтому он может уничтожить все ваши файлы. Если вы работаете с UNIX по телефонной линии, то конец связи можно считать выходом из системы. Наконец, некоторые реализации UNIX располагают меха- низмом простоя. Если ваш терминал бездействовал, скажем, в течение 15 мин, то предполагается, что вы заснули, и осуще- ствляется выход из системы.
ГЛАВА 7 КОМАНДЫ И ОБОЛОЧКА Я случайно уничтожил все свои *файлы. Крик, души В гл. 5 мы ввели понятие «оболочки», расположенной между вами и программами UNIX, которые вы используете. В примерном сеансе предыдущей главы существование оболочки было едва заметным. Вводились команды и выполнялись некоторые дей- ствия. Нас не беспокоило, чьих рук это дело: самой оболочки или других системных программ, которым она передавала управле- ния; нам было важно, что команды выполнялись, а не то, кто за это ответствен. Оказывается, основной вклад оболочки в нашем примерном сеансе состоял в переадресации вывода для некоторых команд; другие ее таланты мы не использовали. В этой главе мы рассмотрим некоторые иные возможности оболочки, и здесь нам действительно будет полезно рассматри- вать оболочку как нечто отдельное. Однако, прежде чем продолжить изложенное, мы познакомим- ся еще с одной командой UNIX, grep, которая особенно удачно согласуется с оболочкой. Команда grep образец файл выводит на дисплей все строки файла, которые сопоставляются с заданным образцом. Часто образец является одним словом;
94 Часть II. Приложение идей например, команда grep Деймлер chapter! выводит все строки chapter!, содержащие слово Деймлер. Коман- да grep полезна сама по себе, но в совокупности с некоторыми другими средствами оболочки она оказывается поистине бесцен- ной . Стиль Значительно легче понять оболочку, если вы отдадите должное стилю, в котором написаны команды UNIX. Любой язык общения с ЭВМ навязывает пользователю неко- торый стиль работы. Если вы знакомы с языками программиро- вания Бейсик и Паскаль, то знаете, что их стили резко отличают- ся друг от друга. Если бы вам показали отдельное предложение из программы, то, даже если вы абсолютно незнакомы с предло- жениями такого вида, вы можете сразу сказать, на каком языке, Бейсике или Паскале, оно написано. Точно так же и UNIX поддерживает определенный стиль записи команд. Стиль предоставляет два достоинства: • легкость изучения. Если вы знакомы со стилем, то можете обычно предугадать, как использовать любую команду. При этом нет необходимости прибегать к документации. • использованием средств. Если все команды следуют одному и тому же стилю, то можно применять автоматические сред- ства, облегчающие написание команд. Такие средства созда- ют положительную обратную связь. Если они хорошие, то это еще более поощряет следование стилю; чем больше адапти- руется стиль, тем легче создавать новые хорошие средства. Любой язык общения с ЭВМ включает в себя: • синтаксис: грамматические правила, в соответствии с кото- рыми пишутся предложения на этом языке; семантику: смысловое содержание языка, т. е. какие дей- ствия будет выполнять ЭВМ. Стиль команд UNIX охватывает как синтаксис, так и некоторые аспекты семантики. К командам, хорошо отражающим стиль UNIX, относится наша излюбленная команда spell. Ее полный синтаксис spell опции имяфайла! имяфайла2... имяфайм^ За именем команды spell непосредственно следуют опции, ко- торые, как вытекает из их названия, являются необязательны- ми. Далее идет список из N имен файлов. Команда spell приме-
Гл. 7. Команды и оболочка 95 няется к каждому из этих файлов по очереди. Если N равно нулю, т. е. имя файла в команде отсутствует, то по соглашению ввод происходит с терминала. Так, мы могли бы набрать любой каталог $ spell Попробуем некоторые слова harrass harass grumpy grumpey precede preseed A d grumpey grumpy harrass $ Здесь мы вводили данные с терминала непосредственно в про- грамму spell, для того чтобы выяснить, как пишутся слова harass (беспокоить), grumpy (сварливый) и precede (предшество- вать). Мы специально выбрали эти примеры, чтобы подчерк- нуть ранее сделанное предупреждение: используйте spell как вспомогательное средство, но не слишком ей доверяйте. Програм- ма spell сверяет написание слов по встроенному словарю. В сло- варе имеются пробелы: возможно, для того, чтобы подчеркнуть, что общество пользователей UNIX исключительно дружное, слово grumpy в нашей системе даже не было включено в словарь, и поэтому программа spell подумала, что это слово написано не- верно. Spell пытается также образовывать слова, применяя общеупотребительные приставки и суффиксы, такие как dis-, pre-, iso-, -ing и -ation. Иногда она воспринимает бессмысленные слова как правильные, если они составлены при помощи таких приставок и (или) суффиксов. Например, программа spell вос- приняла бессмысленное слово preseed, поскольку оно образовано из слова seed (сеять) с приставкой pre- г’. Вернемся от этого отступления к разговору о стиле. Вы могли заметить, что стиль записи имен файлов в качестве аргументов spell соответствует стилю команды cat, которую мы использовали в примерном сеансе в предыдущей главе. Это не случайно и дей- ствительно служит подтверждением единообразию стиля. Имен- но по этой причине мы так подробно изучали команду cat. На 1) Программа, аналогичная spell, для русского языка должна также принимать во внимание окончания слов.— Прим. ред.
96 Часть II. Приложение идей самом деле мы выбрали бы в качестве настоящего примера коман- ду cat, если бы не ее нетипичность: эта команда (по крайней мере в некоторых реализациях UNIX) не содержит опций. Опции Мы исследовали опции при изучении команды 1s. Типичная команда UNIX имеет порядка трех опций, каждая из которых указывается некоторой строчной буквой. Соглашение, в соответ- ствии с которым каждая опция представляется одиночной лите- рой, справедливо для всех команд UNIX, но существуют.боль- шие отклонения от нормы из трех опций. Некоторые команды вообще не имеют опций, в то время как у других так много оп- ций, что они используют все 26 строчных латинских букв, неко- торые прописные буквы, а также несколько других литер. В большинстве реализаций UNIX команда spell близка к нор- ме с тремя опциями. В наших примерах мы будем использовать только одну опцию. —Ь означает использование английского правописания, так, слово realize должно писаться realise. Значительно улучшенная завтрашняя версия программы spell будет иметь в качестве стандарта английское правописание. Упрямцы, конечно, могут, если они хотят стать всеобщим посме- шищем, использовать американское правописание. В этом слу- чае они должны будут использовать новую опцию —w(rong — неправильный (англ.)). Пока же приходится довольствоваться теперешней несовер- шенной версией spell. Примеры ее использования: (1) spell (2) spell —b (3) spell chapterl (4) spell —b chapterl (5) spell chapterl chapter2 chapters (6) spell —b chapterl chapter2 chapters В примерах (1) и (2) входные данные берутся из стандартного ввода, обычно с терминала. В примерах (5) и (6) осуществляется проверка правописания текста в трех файлах chapterl chapter2 и chapters (в указанном порядке, хотя для команды spell порядок не имеет какого-либо значения). Можно было бы расширить некоторые или все рассмотрен- ные примеры, переадресовав вывод, скажем в файл.
Гл. 7. Команды и оболочка 97 Примером других команд UNIX, которые следуют тому же стилю, что и spell, служат команды rm и Is. Примеры их исполь- зования: 1s —1 directoryl directory2 rm chapterl chapter2 Дополнительные аргументы Прежде чем продолжить разговор об аргументах команд UNIX, следует сделать общее замечание: одна из причин богатства со- держания UNIX кроется в том, что в реализацию команд систе- мы внесли вклад много разных людей. В основном все эти раз- работчики придерживались общего стиля UNIX, но, когда дело дошло до более мелких практических деталей, они с неизбеж- ностью разошлись. Это проявляется в спецификации опций. В предыдущей главе отмечалось, что опции начинаются со знака минус, чтобы отличить их от имен файлов, и обычно записываются в начале списка аргументов. Это верно, но имеется ряд команд, которые обладают дополнительной гибкостью, выражающейся в том, что опции могут изменяться внутри списка имен файлов; более того, некоторые команды даже позволяют по желанию опускать знак минус, предшествующий опциям. Такие детали в значительной степени относятся к сфере Дадли, поэтому мы не будем здесь о них беспокоиться. Некоторые команды UNIX располагают другими аргументами дополнительно к опциям и именам файлов. По принятому в UNIX соглашению такие аргументы располагаются после опций (если они есть) и перед именами файлов. Одним из уже встречавшихся примеров служит команда chmod. Другим при- мером является команда grep, которая, как можно догадаться ввиду единообразия стиля UNIX, может содержать список имен файлов. Примеры команды grep: grep kill chapterl grep kill chapterl chapter2 chapters grep —n chapterl chapter2 chapters Все приведенные команды осуществляют поиск kill (убивать). Опция —п означает, что выходным строкам должны предшество- вать номера соответствующих входных строк (так вы могли бы обнаружить, что слово kill встречается в 150-й и 296-й строках файла chapterl). 4 № 161
98 Часть II. Приложение идей Первый аргумент команды grep (не считая в данный момент опций), который служит образцом для поиска, должен быть задан всегда. Поэтому аргумент kill не интерпретируется как имя файла, даже если у нас оказался бы файл с таким же именем. Если бы, однако, аргумент kill был необязательным, то воз- никла бы проблема двусмысленности. Более того, такой необяза- тельный аргумент не может быть представлен одиночной литерой и поэтому не может быть задан непосредственно через механизм опций. В UNIX нет единого соглашения для разрешения этой двусмысленности. Однако наиболее популярный способ — это использовать механизм опций для указания наличия далее опре- деленных аргументов. Все это звучит сложно, поэтому лучше привести пример. Мы выберем средство, вынашиваемое нами в мечтах о системе UNIX будущего. Им является оружие, позволяющее искоренять авторов, пользующихся определенными словами, которые нас раздражают. Это оружие представляет собой необязательное вредное слово (hated-word), которое можно задавать в качестве аргумента команды гт. Если вы наберете: rm conceptualize /usr/crass/document то эта новая команда rm проверит, содержит ли файл document в личном каталоге пользователя crass слово conceptualize, и если да, то не только уничтожает этот порочный файл, но также уничтожает все другие файлы в личном каталоге crass — неза- висимо от установленных для них полномочий. Хорошо бы еще, чтобы эта воображаемая команда rm изменяла пароль пользо- вателя crass на случайную комбинацию, так чтобы он уже ни- когда больше не мог войти в систему. В данный момент эта команда rm имеет один недостаток: ее синтаксис двусмысленный, поскольку аргумент вредное слово — необязательный. Поэтому неясно, является ли conceptualize именем файла или вредным словом. Чтобы разрешить эту дву- смысленность, представим синтаксис команды в виде rm —h conceptualize /use/crass/document Опция —li указывает, что следующим аргументом является вредное слово, а не имя файла. (Заключительная мысль по этому поводу: теперь эта книга содержит слово conceptualize — оно встречается даже несколько раз. Нам следует быть более осторожными, когда осуществятся наши мечты о новой команде rm, а также когда будет реализована новая команда spell.)
Гл. 7. Команды и оболочка 99 Заключительные замечания о стиле Резюмируя стиль записи команд UNIX, отметим: • опции в команде UNIX задаются первыми и сопровождают- ся знаком минус; • любые аргументы, не являющиеся именами файлов, задаются следом за опциями. Если команда содержит необязательные аргументы, то в ней могут быть использованы опции, указы- вающие на наличие определенных аргументов; • команда оканчивается списком имен файлов произвольной длины. Если этот список опущен, то предполагается стан- дартный ввод. Команда может также содержать инструкции для переадресации стандартного ввода-вывода. Мы обсудим эту возможность позд- нее в этой же главе. Ясно, что существуют некоторые команды, которые не впи- сываются в указанный стиль. Примером могут служить команды mv и ср, которые по своей сути всегда должны содержать в ка- честве аргументов два имени файла. («Это неверно,— сказал Дадли.— Существуют альтернативные формы команд ср и mv, приведенные на страницах 1096 и 1214 моих заметок для поль- зователей UNIX, в которых ...».) Однако эти исключения явля- ются лишь небольшими отклонениями от единообразного в целом стиля записи команд UNIX. Система обозначений для описания синтаксиса В большинстве документации по системе UNIX принята стан- дартная система обозначений для описания общей формы каж- дой команды. Например, команда 1s описывается так: 1s [опции] файл ... Эта запись проста для понимания, поскольку в ней использу- ются всего два соглашения: [л'х'.с] означает, что аргумент ххх по желанию может быть опущен; ххх... означает, что может быть задано произвольное число аргументов вида ххх. В приведенном выше описании, таким образом, говорится, что в команде 1s могут быть опущены опции и указано произвольное число файлов. Аналогично, описание ch mod режим файл ... 4*
100 Часть II. Приложение идей определяет, что первым аргументом команды chmod является нечто под названием режим, и за ним следует список файлов произвольной длины. Понятно, что в документации по команде chmod должно быть объяснено, что такое режим, так же как в документации по 1s должны быть описаны опции. Поскольку программы UNIX и документация по ним напи- саны большим числом различных разработчиков, то имеются тенденции к некоторым нарушениям в использовании соглаше- ний. Однако почти наверняка истинно, что если аргумент описан как файл, имя или имя-файла, то этот аргумент и в самом деле является именем файла. Квадратные скобки [ и ] в действительности могут быть вложенными, например abc [—[р] [q] [г]] Здесь говорится, что аргумент команды abc может состоять из знака минус, и если он задан, то за ним могут следовать р и (или) q и (или) г. Таким образом, допустимы следующие записи: abc abc — abc —р abc —pqr В действительности в большинстве документации по системе UNIX вместо приведенной принята более грубая запись: abc [—pqr] которая, если ее понимать буквально, означает, что вы можете указать или —pqr или вообще ничего; однако читатели догады- ваются, что эта запись в действительности означает то же самое, что и исходная спецификация команды abc. На самом деле мно- гие команды UNIX имеют еще большую гибкость, допуская раз- дельные спецификации опций, например: abc —р —q —г Квадратные скобки и многоточия, используемые в системе обо- значений для описания команд, могут, если нужно, объединять- ся, т. е. запись Ixxxl ... означает, что ххх может повторяться произвольное число раз, включая нуль раз. И вновь в документации встречаются отклонения от этого согла- шения, так что запись XXX ...
Гл. 7. Команды и оболочка 101 часто включает возможность повторения ххх нуль раз — на са- мом деле именно так понимается эта запись в описании 1s, при- веденном выше. Тем не менее такие отклонения не умаляют достоинств кар- тины в целом. Усвоив стиль UNIX и ее простую систему обоз- начений для описания синтаксиса, вы сможете легко читать документацию по системе UNIX и овладеете полезными для вас командами. Различные оболочки Существует несколько популярных оболочек, используемых в различных реализациях UNIX. Одна из них, созданная в Bell Laboratories,— это так называемая оболочка Баурна, назван- ная по имени Стива Баурна. Стив Баурн — автор книги The UNIX system 11, которая существенно сложнее той, что вы сей- час читаете. Другой хорошей оболочкой является оболочка С, синтаксически связанная с языком С. Оболочка создана в другом центре, известном своим вкладом в UNIX: в Калифорнийском университете в Беркли. Оболочка (shell) Баурна сокращенно называется sh — требование отшл все называть скромно и крат- ко, а оболочка С называется csh. Все, что было сказано о стиле, и почти все, что позднее в этой главе мы сообщим об оболочке, относится к обеим оболочкам sh и csh (и к большому числу их вариантов). В редких случаях, где это необходимо, мы будем предполагать оболочку sh. В об- щем случае вам нужно знать, с какой оболочкой вы работаете, только если вы пишите замысловатые программы на языке обо- лочки, но такие программы лежат вне сферы данной книги. Металитеры Мы отмечали, что однообразие стиля тесно связано со средства- ми, облегчающими написание команд. Теперь мы можем проде- монстрировать конкретное средство, предоставляемое оболоч- кой, которое значительно облегчает спецификацию как отдель- ных имен файлов, так и списков имен файлов. Это метод, с помощью которого оболочка порождает имена файлов. Она выполняет это путем присваивания специального смысла следующим литерам: ? означает любую одиночную литеру, * означает любую последовательность литер (включая пустую), [abc] означает или а, или Ь, или с. 11 Имеется перевод: Баурн С. Операционная система UNIX.— M.S Мир, 1986.— Прим. ред.
102 Часть II. Приложение идей Указанные специальные литеры называются металитерами. Если вы используете металитеры в каком-либо аргументе команды UNIX, то оболочка расширяет этот аргумент до списка всех имен файлов, которые могут быть сопоставлены с данным аргумен- том. Гораздо легче понять это, если мы рассмотрим конкретные примеры. Предположим, что наш текущий каталог, связанный с редак- тируемым нами журналом, содержит имена файлов advice articleO articlel article2 articles commentl comment2 comments commerce Тогда следующие примеры показывают, как можно обращаться к файлам в этом каталоге: Пример 1 cat с* эквивалентно cat commentl comment2 comments commerce Пример 2 spell comment? эквивалентно spell commentl comment2 comments Пример 3 chmod 644 article[23] эквивалентно chmod 644 article2 articles Пример 4 cat *r*[3e] выполняет конкатенацию всех файлов с именами, содержащими букву г и оканчивающимися на цифру 3 или букву е. Поэтому эта запись эквивалентна cat articles commerce Пример 5 grep kiss articled—3] демонстрирует еще одну возможность. Запись 1—3 внутри квад- ратных скобок означает любую литеру от 1 до 3 включительно и поэтому эквивалентна grep kiss articlel article2 articles
Гл. 7. Команды и оболочка 103 Пример 6 rm * уничтожает все файлы в текущем каталоге. Пример 7 rm /usr/aper/* удаляет все файлы пользователя арег при том условии, конечно, что у вас есть разрешение на их удаление. Этот пример показы- вает, что можно применять механизм металитер ко всем катало- гам, а не только к текущему. Отметим, что списки имен файлов, порождаемые оболочкой, упорядочены в алфавитном и числовом порядке (например, b сле- дует за а, а 2 — за 1). Строго говоря, порядок определяется ко- ДО1М ASCII или каким-либо другим кодом, используемым в вашей системе литер. Такое упорядочение вполне естественно, посколь- ку оно точно такое же, как и упорядочение, используемое коман- дой 1s. Отметим также, что оболочка пытается расширять металитеры во всех аргументах — она не знает, какие из аргументов будут именами файлов. Поэтому, если вы напишите grep с* advice чтобы найти вхождения цепочки с* в файле advice, то оболочка автоматически превратит это в grep commentl comment2 comments commerce advice затем grep будет прилежно искать слово commentl в каждом из четырех специфицированных файлов. Скорее всего она его не найдет, и поэтому, верная традиции UNIX, ничего не ответит. Результатом этого является то, что если вы ясно не представляе- те, какую закулисную работу выполняет оболочка, то останетесь при мнении, что цепочка с* не содержится в файле advice, а это может быть далеко от истины. Итак, бывают случаи, когда желательно, чтобы оболочка оставила вас в покое, и оболочка милостиво предоставляет меха- низм для осуществления этого. Все, что заключено в кавычки, трактуется оболочкой буквально. Поэтому нам следовало запи- сать исходную команду grep в виде grep 'с*' advice Использование кавычек позволяет преодолеть еще одну проблему. Если бы вы захотели найти слова he said (он ска- зал) в файле articlel, то команда
104 Часть II. Приложение идей grep he said articlel выполняла бы поиск слова he в (несуществующем) файле said и в файле articlel. Вместо этого вы можете набрать grep 'he said' articlel Еще несколько советов по поводу имен файлов Существование металитер заставляет проявлять еще большую осторожность при выборе имен файлов. Наш знакомый случайно создал файл с именем *. Он решил его уничтожить и Великий вредитель, живущий в нем, набрал rm * Следующие три недели наш знакомый потратил на воссоздание всех своих файлов, которые он случайно уничтожил. Он, ко- нечно, должен был ввести команду rm '*' Он мог воспользоваться и другой возможностью системы UNIX, которая состоит в том, что если литере предшествует знак \ — обратная косая черта,— то оболочка предполагает, что вы дей- ствительно имеете в виду эту литеру. (Если вам нужна литера обратная косая черта, то ее следует повторить дважды). Таким образом, эквивалентом приведенной выше команды rm является rm \* Если у вас есть приятель, который похваляется своими по- знаниями UNIX, создайте в одном из его каталогов (если вам это разрешается) файл с именем * и поместите в него сообщение Вы совершенно не знаете UNIX Если он поспешит уничтожить это возмутительное сообщение и забудет при этом использовать кавычки или обратную косую черту, добудет вынужден подтвердить, что сообщение было дей- ствительно справедливым. Металитеры оболочки могут оказывать влияние на выбор вами имен файлов и другим, более положительным способом. Если вы готовите книгу или доклад, то полезно называть главы chapterl, chapter2 и т. д. Тогда можно просто набрать cat chapter* чтобы вывести на дисплей всю книгу. Если в книге есть введение, то этот файл целесообразнее назвать chapterO, а не introduction, чтобы к нему можно было обращаться тем же способом. Если книга содержит более 9 глав, то возникает другая проблема.
Гл. 7. Команды и оболочка 105 При использовании имени chapterlO для десятой главы порядок, в соответствии с которым файлы выводятся на дисплей вышепри- веденной командой cat, будучи строго алфавитным, выглядит так: chapter 1 chapterlO chapter2 Будет очень печально, если в chapterlO раскрывается, кто был убийцей. С другой стороны, если бы вы назвали эту главу chapterOl, то она оказалась бы на верном месте. Как бы то ни было наступает момент, когда такие хитрости в выборе имен файлов больше создают проблем, чем их решают, и разумные названия файлов должны взять вверх над ухищре- ниями. Многие пользователи UNIX применяют металитеру * для того, чтобы пользоваться длинными, а следовательно, более осмысленными именами файлов, но не набирать их полностью. Так, вы могли бы иметь файл с именем division3scores; если у вас нет в том же каталоге какого-либо еще файла с именем, содержа- щим цифру 3, то вы могли бы использовать просто *3* для обращения к файлу division3scores, сократив тем самым число нажатий на клавиши. И вновь такого рода хитрости лучше при- менять в разумных пределах. Расширения Существует одна литера, помимо букв и цифр, которая обычно используется в именах файлов UNIX. Это точка. Общепринято в конце имени файла ставить точку, а за ней — несколько ли- тер, показывающих, какого типа информация хранится в файле. Это называется расширением. Примеры расширений; aver age.р программа на Паскале, average.с программа на языке С, average, spec спецификация программы average. Такое соглашение имеет следующие достоинства: • некоторые программы UNIX требуют имена файлов с опре- деленными расширениями, чтобы им не подсовывали чепуху. Так, компилятор языка С обязательно требует, чтобы исход- ные программы хранились в файлах с расширением .с,
106 Часть II. Приложение идей • некоторые компилирующие программы UNIX (например, компилятор языка С) используют расширение, чтобы иденти- фицировать тип файла; например, расширение .о, означает промежуточный двоичный файл в отличие от исходной программы. Мы обсудим эти вопросы в гл. 12; • расширения удобно использовать с метасимволом *. Так, запись *-Р ссылается на все программы на языке Паскаль в текущем ка- талоге. Отметим, однако, что механизм расширений — это просто согла- шение об именовании файлов, и он не оказывает никакого влия- ния на способ хранения файлов. Ничто не помешает вам задать расширение .р для файла, не являющегося программой на Паскале, хотя вы можете тем самым сбить с толку программы UNIX, использующие расширение (например, компилятор с Паскаля). Файлы README Система UNIX (как, впрочем, и другие операционные системы), имеет некоторый недостаток, состоящий в том, что каталоги со- держат только имена файлов и пользователь не имеет возмож- ности вставить напротив имени комментарий для того, чтобы сказать более подробно о назначении файла. Механизм расши- рений является всего лишь слабой отговоркой по отношению к настоящим средствам комментирования. Чтобы преодолеть этот недостаток и вообще сделать систему UNIX более друже- любной, принято соглашение определять так называемые файлы README п. Вы помещаете файл README в каждый каталог, для которого требуются дополнительные пояснения. Этот файл содержит краткое словесное описание каталога и файлов, со- держащихся в нем (например, «это ноябрьский выпуск журнала; статьи собраны в файлы... Чтобы получить копию журнала, сделайте следующее: ...»). Применение прописных букв в имени README не всем по душе, поэтому ряд пользователей исполь- зуют такие имена, как readme или read.me. Достоинство заглав- ных букв состоит в том, что они бросаются в глаза в листинге. Стоит отметить также, что к README можно обычно недвусмыс- ленно обращаться через R*. 1) В переводе с английского означает «прочти меня».— Прим. ред.
Гл. 7. Команды и оболочка 107 Сводка советов Суммируя советы для начинающих по выбору имен файлов, отме- тим • если вы пишите программы, используйте расширения для указания типа ваших файлов; • в именах файлов используйте только буквы и цифры (совме- стно с точками для расширений); • выбирайте систематизированные имена файлов с прицелом на использование металитер; • будьте анти-отшл и выбирайте смысловые, а потому несколько длинные имена файлов; когда это целесообразно, пользуй- тесь металитерами для сокращения длинных имен; • создавайте файлы README для пояснения ваших действий. Команда echo UNIX содержит команду echo (эхо), которая просто выводит свои аргументы, например, любой каталог $ echo hello there hello there $ Это само по себе не может вас поразить как мощное средство, которое вам позарез необходимо, но команда echo полезна, когда надо посмотреть, как расширяются металитеры. (Команда echo используется и для других целей, которые мы рассмотрим позднее.) Предполагая, что текущим является наш журнальный каталог, использовавшийся выше, покажем действие команды echo на следующих примерах: /usr/me/magazine $ echo Current articles: article* Current articles: articled article! article2 article3 $ echo '***' [a—g]????? *** advice $
108 Часть II. Приложение идей Во второй команде echo три звездочки в начале аргумента заклю- чены в кавычки и поэтому копируются сами по себе. Остаток аргумента представляет собой образец для поиска всех имен файлов, начинающихся с буквы от а до g, за которой следуют еще ровно 5 литер. Такому образцу соответствует единственное имя файла advice. Переадресация Мы уже встречались с использованием литеры > для переадреса- ции вывода, например, cat >scores Если вы хотите добавить информацию в конец существующего файла, то следует использовать » вместо >. Например, cat »scores обеспечивает дозапись в конец файла scores. (Если файл scores уже не существует, то система создает новый файл с именем scores и действие знака » в этом случае не отличается от дей- ствия >.) Можно переадресовать ввод, используя символ <; например, команда cat < existingfile вводит данные для cat из файла existingfile, а не со стандартного ввода. Вы можете, однако, набрать cat existingfile чтобы выполнить то же самое; поэтому переадресация ввода не позволяет cat делать что-либо, что она не в состоянии сделать сама по себе. То же самое относится к большинству других встроенных команд UNIX, и большинство людей, использую- щих переадресацию ввода, это те, кто разрабатывает свои соб- ственные программы (см. гл. 12). Все переадресации выполняются оболочкой, а не ядром си- стемы UNIX. В этом легко убедиться, набрав echo hello >t Оболочка отбрасывает >t от команды и просит команду echo выполнить свою задачу с аргументом hello. Та честно копирует hello в стандартный вывод, но оболочка перехватывает этот вы- вод и посылает его в файл t. Если вы затем выведете на дисплей файл t, то увидите, что он содержит текст hello, а не hello >t Так как оболочка отбрасывает инструкции переадресации, то,
Гл. 7. Команды и оболочка 109 следовательно, месторасположение этих инструкций в команде несущественно. Так, следующие записи эквивалентны: grep kiss <existingfile >t grep kiss >t <existingfile grep >t Cexistingfile kiss (Этим записям также идентична запись grep kiss existingfile >t Таким образом, переадресация ввода в команде grep, как и в cat, не дает какого-либо дополнительного преимущества.) Малодушным Если вы находите эту главу сложной, то с этого момента можете прекратить ее изучение. Мы еще изложим несколько важных вопросов — особенно методы реализации в системе UNIX не- которых концепций, рассмотренных нами в части I, таких как конвейеры и фоновые процессы. Однако вы можете поработать с UNIX в течение первого месяца или около этого без сознатель- ного их использования. Поэтому, если вы сейчас находитесь в состоянии шока от оболочки, вам лучше сохранить то, что оста- лось от вашей духовной энергии для следующей главы, содержа- щей материал, который нужно знать каждому с первого дня. Конвейеры Для тех отважных читателей, кто дочитал до этой страницы, наградой послужит то, что наша следующая тема — конвейеры — предельно проста для понимания. Вы просто записываете после- довательность команд, разделенных символом |. Например, 1s | spell проверяет, все ли ваши имена файлов (но не содержимое этих файлов) являются правильными словами. Действие этого таково, что вывод от 1s, вместо того чтобы идти на терминал, переадре- суется и становится вводом для команды spell. Поэтому приве- денная выше команда эквивалентна двум командам: Is > tempfile spell < tempfile но работает, естественно, намного быстрее и более удобна. Кон- вейер имеет то особое преимущество, что команды 1s и spell работают параллельно, а не последовательно. Проверка правописания имен файлов — это несколько курь- езное использование конвейера. Для того чтобы дать несколько
ПО Часть II. Приложение идей более реальных примеров конвейеров, мы рассмотрим еще несколько команд UNIX, которые удобны для использования в качестве фильтров, т. е. элементов конвейеров. К этим коман- дам, каждая из которых делает что-либо с данными из стандарт- ного ввода и посылает результат в стандартный вывод, относятся sort сортирует (упорядочивает) в алфавитном по- рядке; uniq удаляет каждую строку, идентичную преды- дущей; tr stringl string2 преобразует каждую встретившуюся литеру из цепочки stringl в соответствующую ли- теру из цепочки string2. «Команда sort — очень интересная,— сказал Дадли.— Она со- держит массу опций для задания ключей сортировки, для слия- ния, для сортировки в обратном порядке, для . . .». Цепочки, используемые в качестве аргументов в команде tr, могут включать диапазоны литер, например а—f для букв а, Ь, с, d, е и f. Приведем два примера команды tr, каждая из ко- торых работает со стандартным вводом и посылает результат на стандартный вывод: tr АВ 78 преобразует каждую букву А в 7, а каждую букву В в 8; tr А—Z а—z преобразует каждую букву А в а, В в b и т. д., т. е. преобразует все прописные буквы в строчные. Добавив эти три команды к нашему арсеналу, мы можем теперь рассмотреть несколько более полезных примеров конвейеров. Предположим, что файл names содержит список всех жителей города. Каждая строка файла состоит из имени, фамилии и возраста жителя, например, Fiona Hawkins 9 Fred Brown 12 Charles Smith 33 Файл упорядочен по возрасту. Следующие примеры демон- стрируют команды, которые можно применить к этому файлу: Пример 1 grep Smith names выводит на дисплей все строки файла names, содержащие имя Smith.
Пример 2 grep Charles names | grep 33 выводит на дисплей все строки файла names, которые содержат и Charles и 33 (в любом порядке, хотя в данном случае возраст всегда следует вторым). Пример 3 grep Charles names | grep 33 | uniq Эта команда аналогична команде примера 2, за исключением того, что повторяющиеся строки удаляются (например, если бы в списке два раза встречался Charles Smith 33). Пример 4 Мы обнаруживаем, что некоторые имена целиком набраны строчными буквами (например, Charles smith), некоторые очень важные особы представлены целиком прописными буквами (например, CHARLES SMITH), в то время как в других именах используется смесь прописных и строчных букв (например, Charles Smith). В наших предыдущих примерах только послед- нее из этих трех имен было бы распознано. Если бы в примере 2 мы хотели найти всех с именем Charles в возрасте 33 лет неза- висимо от того, какими буквами это имя написано — пропис- ными или строчными, то мы расширили бы наш конвейер сле- дующим образом: tr А—Z а—г <names | grep smith | uniq Пример 5 Наконец, наш последний конвейер находит всех, носящих фамилию Smith, и упорядочивает их в алфавитном порядке по именам, удаляя дубликаты. tr А—Z а—z <names | grep smith | sort | uniq Использование конвейеров Надеемся, что вы начинаете понимать из приведенных выше примеров, что если у вас есть файл с информацией и вы хотите извлечь эту информацию или часть ее и представить ее в друг or* виде, то у вас есть шансы достичь этой цели посредством одной конвейера. Это лишний раз подтверждает достоинство фило софии «программных средств» UNIX: система обеспечивае набор модульных компонент и дает пользователям возможност объединять вместе эти модули для построения команд, орие! тированных на решение конкретных задач.
112 Часть II. Приложение идей Конвейеры представляют собой необычную концепцию даже для опытных пользователей ЭВМ, впервые знакомящихся с UNIX, и требуется время, чтобы ясно понять, каким мощным средством они являются. Если вы обнаружите, что создаете многочисленные файлы для хранения промежуточных резуль- татов, это признак того, что следует воспользоваться конвей- ерами. Выполнение фоновых команд Если вы хотите выполнить фоновую команду, так чтобы, пока она выполняется, делать еще что-либо, вы просто добавляете к команде символ &, например, /usr/me/novel $ spell chapter* >t& 7654 $ В данном случае мы применяем программу проверки правопи- сания spell ко всем главам большой книги и переадресовываем вывод — список неправильных слов — в файл t. Система отве- чает числом 7654 (каждый раз она выдает новое произвольное число) и выводит командную подсказку, так что можно продол- жить работу, пока выполняется фоновая команда. С этого мо- мента мы используем два отдельных процесса внутри ЭВМ: выполнение фоновой команды и наш обычный диалог с оболоч- кой. Если на машине работают и другие пользователи, они также могут выполнять фоновые процессы в дополнение к своим ос- новным процессам. Таким образом, число одновременно сущест- вующих процессов может значительно превышать количество пользователей ЭВМ. Произвольное число 7654 является идентификатором про- цесса (PID, как его называет отшл) для нашего фонового про- цесса. Это число однозначно идентифицирует этот процесс среди всех прочих. В большинстве случаев вы будете игнорировать идентификаторы процесса —они больше относятся к сфере Дадли; однако идентификатор процесса ID полезен, если надо «убить» процесс. Специалисты по вычислительной технике не только рисуют деревья корнями вверх, но также имеют свой жаргон: слово «убить» означает остановить выполнение. Предположим, что вы неожиданно решаете не применять проверку правописания к своей книге, поскольку она написана на латыни и, следовательно, программа spell будет отвергать
Гл. 7. Команды и оболочка 113 практически каждое слово. Поэтому вы решаете убить фоновый процесс, чтобы предотвратить потери машинного времени и создание огромного файла t. Для этого вы используете команду kill 7654 и процесс, идентифицируемый числом 7654, умирает (т. е. пре- кращает выполнение). Если вы хотите взглянуть на все ваши процессы, то можете воспользоваться командой ps. Если бы мы ввели команду ps до уничтожения процесса 7654, то получили бы на дисплее такую информацию: PID TTY TIME COMMAND 6005 ttyll 0:06 sh 7654 ttyll 0:10 spell chapterl chapter2 chapters (Точный формат зависит от реализации UNIX.) Последняя строка показывает, что наш фоновый процесс для использо- вания программы spell действительно имеет номер 7654. Он управляется с ttyll — такое имя дала система UNIX нашему терминалу (см. ниже) — и выполняется в течение 10 секунд. Обратите внимание, что выполняемая команда spell представ- лена в расширенной форме, порожденной оболочкой, т. е. за- пись со звездочкой расширена в список имен файлов. (Поэтому внутреннее представление команды UNIX в общем случае может отличаться от вашей записи, так что не удивляйтесь, если команда ps выдает необычную интерпретацию.) Кроме того, ps показывает, что нами выполняется второй процесс под номером 6005. Это оболочка, программа sh, с которой мы обща- емся все время. Некоторые пользователи UNIX находят развлечение в постоянном наборе команды ps, чтобы следить за ходом выпол- нения своих фоновых процессов. Приведенные выше 10 секунд могли бы, например, измениться на 11, если бы мы набрали команду ps вторично. Однако если вы будете тратить свое ос- новное время на постоянное слежение за фоновым процессом, то это лишит смысла саму идею выполнения фоновой программы. Вас не ограничивают требованием выполнять только один фоновый процесс. Вы можете выполнять столько фоновых про- цессов, сколько пожелаете, так что вывод команды ps может заполнить половину экрана. Еще несколько фактов о фоновых процессах: • если вы нажимаете клавишу останова, то это останавливает только основной процесс, а не фоновый; • в некоторых реализациях UNIX фоновый процесс может продолжаться в том случае, если вы выйдете из системы;
114 Часть II. Приложение идей в других при выходе из системы убиваются все ваши про- цессы; • в некоторых реализациях UNIX фоновые процессы не могут взаимодействовать с терминалом; • в некоторых реализациях UNIX вы можете превратить ос- новной процесс в фоновый или наоборот, пока он еще выпол- няется. Мы приносим извинения за повторение слов «в некоторых реализациях UNIX», но вам действительно следует внимательно просмотреть на этот счет документацию по своей системе. Большинству из нас тяжело вести одновременно несколько разговоров. Поэтому, если только вы не являетесь счастлив- чиком, имеющим супертерминал с несколькими отдельными «окнами» в UNIX, лучше всего ограничить свой диалог с UNIX только основным процессом и переадресовать ввод-вывод из фоновых процессов, так чтобы они не появлялись на вашем терминале. Использование печатающего устройства В первой части книги мы познакомились с понятием спулинга, посредством которого операции с устройствами ввода-вывода, такими как печатающее устройство, выполняются в фоновом режиме, пока вы заняты другой работой. Команда Ipr файл . . . копирует заданный файл(ы) в специальное место, откуда он (они) будет выведен на печать. Процесс спулинга, который будет выполнять саму печать, запускается как фоновый, поэтому нет необходимости в конце команды Ipr указывать литеру &. Команда Ipr часто используется в конце конвейера, например, grep plumber traders | sort | Ipr Эта команда осуществляет поиск всех строк в файле traders (торговцы), которые содержат слово plumber (водопроводчик), сортирует найденные строки и печатает их. В некоторых системах команда Ipr называется орг. Определение своих собственных команд Предположим, что мы привыкли помещать пояснительный файл README в каждый свой каталог. Наше обычное действие при входе в каталог, с которым мы давно не работали, состоит в наборе двух команд
Гл. 7. Команды и оболочка 115 cat README Is Учитывая, что мы набираем эта пару команд довольно часто, мы можем слегка облегчить нашу будущую жизнь, поместив указанные команды в файл под названием, скажем, info. Это делается следующим образом: /usr/me/любойподкаталог $ cat >info cat README Is Ad $ Теперь мы написали, хотя и скромную, программу: файл info содержит две команды оболочки и представляет собой программу оболочки. Когда нам потребуется выполнить указанную пару команд, мы можем выполнить содержимое файла info, вместо того чтобы каждый раз набирать эти команды. Выполнение команд оболочки Прежде чем объяснить, как выполнить программу оболочки в файле info, мы должны поведать о важном и мощном свойстве самой оболочки. Оболочка является обычной программой UNIX, которая самым обыкновенным образом читает команды, набира- емые вами на терминале, и осуществляет их выполнение. Как и другие программы UNIX, оболочку можно заставить брать входные данные из файла, а не с терминала (стандартного ввода). Так, чтобы выполнить файл info, можно набрать sh Cinfo Эту команду можно слегка сократить, написав sh info Оболочка, подобно многим другим программам UNIX, позво- ляет в качестве аргументов задавать список имен файлов; в этом случае она читает команды из каждого из указанных фай- лов по очереди точно таким же способом, что и программа cat. В приведенном выше примере задан только один файл info. Когда файл info обрабатывается оболочкой, то содержащиеся в нем две команды выполняются точно так же, как если бы они вводились с терминала.
116 Часть II. Приложение идей Приведенное выше использование оболочки интересно и по другой причине. Командная строка sh info (или sh Cinfo) интерпретировалась оболочкой подобно всем командным строкам. Эта командная строка имеет, однако, необычное свойство: она вызывает оболочку. Таким образом, мы использовали оболочку внутри оболочки. UNIX, к счастью, разрешает такое «вложен- ное» использование программ на любую желаемую глубину (например, оболочка внутри оболочки внутри оболочки...). Использование оболочки внутри оболочки станет для вас наи- более очевидным, если вы наберете sh info& Здесь вы четко видите экземпляр оболочки, выполняющейся в фоновом режиме с файлом info в качестве входа, в то время как ваша основная оболочка продолжает вести с вами диалог. Как сделать файл выполнимым На самом деле можно даже сделать лучше, чем это сделано в приведенном выше примере выполнения программы оболочки с файлом info. Мы можем перевести info в статус команды UNIX, которую можно использовать точно так же, как встроенные команды UNIX, такие как date и 1s. Это сделать очень просто: все, что требуется, это изменить полномочия для info, так чтобы он стал выполнимым файлом. Вот соответствующая команда: /usr/me/любойподкаталог $ chmod 755 info $ is —1 info —rwxr—xr—x 1 me 14 Nov 29 14:41 info $ Мы выполнили команду Is, чтобы удостовериться, что теперь info — действительно выполнимый файл (если вы задаете команде 1s аргумент, который не является каталогом, то она выводит информацию только об этом файле). Теперь мы сделали файл info выполнимым, и он стал нашей собственной командой дополнительно к встроенным командам UNIX. Поэтому можно использовать info точно так же, как мы используем встроенные команды, такие как date и 1s, т. е. info Мы получаем распечатку текущего файла README и лис- тинг текущего каталога
Гл. 7. Команды и оболочка 117 Хотя в данном случае info выступает как отдельная команда, она, если заглянуть за кулисы, выполняет свою задачу путем использования двух нижележащих команд cat и 1s. Это пример типичного свойства UNIX, которое проявляется, например, в следующем: • каталог сам может содержать каталоги; • дерево само может содержать деревья, и, если идти еще дальше, файловая система сама может содержать файловые системы. Поэтому неудивительно, что команда сама может быть сделана из команд. Техника построения объектов из подобных объектов является одной из причин силы и изящества UNIX. Читателям-программистам, наверное, будет интересно уз- нать, как программы оболочки отличаются от программ, кото- рые они (читатели) могут написать, используя свои любимые языки программирования; поэтому мы скажем еще пару слов о выполнимых файлах. К выполнимым файлам относятся или двоичные программы, которые были созданы с использованием какого-либо языка программирования (например, С — мы расскажем об этом в гл. 12), или программы оболочки. Первые имеют секретный маркер, заносимый в них «загрузчиком»,— вновь тема, которую мы обсудим в гл. 12. В данном случае файл info не содержит такого секретного маркера и поэтому считается программой оболочки. Когда вы набираете info UNIX просто воспринимает это как sh info Переадресация ввода-вы вода для программ оболочки Когда вы определяете свои собственные команды, они получают все свойства встроенных команд UNIX. В частности, можно переадресовать их ввод и (или) вывод, а также использовать их в качестве компонент конвейеров, например, info >t info | 1рг Стоит подробнее проанализировать первый пример. В данном случае мы осуществляем вложенное обращение к оболочке, чтобы выполнить команду info, и для такого вложенного вызова стандартным выводом будет файл t, а не терминал. Команды cat и 1s внутри info, следовательно, направляют свой вывод в файл t. Если бы, однако, info содержала команду, которая
118 Часть II. Приложение идей явно переадресовывала свой вывод в файл tl, то это привело бы к переадресации на более глубоком уровне и вызвало бы вывод в файл tl, а не в стандартный вывод t. Командные каталоги Мы еще не закончили рассмотрение команды info. Можно пойти еще дальше и повысить ее статус до уровня полноправной ко- манды системы UNIX. Это мы сделаем, используя аппарат командных каталогов. Чтобы объяснить соглашение о командных каталогах, принятое в UNIX, вернемся назад к исходным прин- ципам и рассмотрим формат некоторых команд UNIX: Is cat х у info spell chapterl Во всех четырех случаях имя команды (т. е. Is, cat, info или spell)— это просто имя файла; этот файл является выполнимым, и акт его выполнения определяет действие команды. Так, выполнение программы оболочки в файле info определяет команду info. Точно так же где-то в файловой системе UNIX имеется выпол- нимый файл с именем spell; этот файл содержит программу для проверки правописания слов. Из четырех приведенных выше команд только файл info может быть в нашем текущем каталоге; несмотря на это, в трех остальных случаях от нас не требуется писать маршрутные имена файлов, чтобы показать, какой каталог содержит требуе- мый файл. Причина этого состоит в том, что (только) для имен команд UNIX использует предопределенный метод поиска имени файла с помощью так называемого маршрута поиска. Маршрут поиска стандартно начинается с текущего каталога, и если имя команды в нем не найдено, то поиск продолжается в других каталогах, о которых известно, что они содержат выполнимые файлы, соответствующие командам. По соглашению все командные каталоги имеют имя bin. Если вы посмотрите на корневой каталог своей системы UNIX, то обнаружите, что он содержит каталог с именем bin, и если вы затем заглянете внутрь bin, то увидите, что имена фай- лов в нем действительно соответствуют встроенным командам UNIX. В большинстве систем UNIX встроенные команды рас- пределены по нескольким командным каталогам bin, В част- ности, каталог /usr обычно содержит подкаталог bin, в котором также содержатся встроенные команды. В нашей книге мы будем полагать, что все встроенные команды хранятся либо в /bin, либо в /usr/bin.
Гл. 7. Команды и оболочка 119 Пользователи могут создавать свои собственные командные каталоги и помещать в них команды, которые они определили сами. По соглашению такой каталог является подкаталогом личного каталога пользователя. Поэтому можно создать каталог bin, если его у нас еще нет, и переслать в него наше определение файла info. Чтобы оценить достоинство этого, вначале проанализируем, как определяется маршрут поиска. Если х является именем текущей команды, а имя пользователя те, то обычный маршрут поиска следующий: • вначале осуществляется поиск х в текущем каталоге; • если он оканчивается неудачно, поиск х продолжается в /usr/me/bin; • если он оканчивается неудачно, поиск х продолжается в /bin; • если он оканчивается неудачно, поиск х продолжается в /usr/bin; • если он оканчивается неудачно, выдается сообщение об ошибке; • во всех случаях выдается сообщение об ошибке, если х не является выполнимым файлом. По умолчанию маршрут поиска определяется суперпользова- телем. Вероятнее всего, он будет таким же, как и вышеприве- денный, за исключением того, что в нем может не быть каталога /usr/me/bin. Если его нет, то, когда вы впервые создадите соб- ственный командный каталог, вам придется добавить /usr/me/bin в свой маршрут поиска. Можно добавить к маршруту поиска и другие каталоги, например командные каталоги ваших дру- зей. Мы объясним, как изменить маршрут поиска позднее; пока же будем полагать, что /usr/me/bin и в самом деле включен в маршрут. Достоинство перемещения info в каталог bin состоит в том, что если он там находится, то команда info распознается неза- висимо от текущего каталога, так как /usr/me/bin всегда входит в маршрут поиска. Если файл info хранится в каталоге, которого нет в маршруте поиска, то команда info распознается только тогда, когда этот каталог является текущим. Некоторые команды по своей сути локальны в некотором каталоге, и их лучше всего хранить в нем. Однако любую ко- манду, которая используется глобально, стоит поместить в командный каталог на своем маршруте поиска. В заключение отметим еще три особенности маршрутов поиска: • если вы хотите выполнить файл, который находится вне те- кущего маршрута поиска, можете указать его полное марш-
120 Часть II. Приложение идей рутное имя. Например, имя команды /usr/me/info обеспечивает выполнение программы info в каталоге /usr/me независимо от текущего каталога и маршрута поиска. (Точ- ное правило состоит в том, что если имя команды содержит /, то предполагается, что оно является частью маршрутного имени файла и обычный маршрут поиска не используется.); • если вы пересылаете файл в командный каталог, то в неко- торых реализациях системы вам придется выйти из системы и снова войти в нее, чтобы новая команда стала распозна- ваться. Причина такого курьезного поведения кроется в том, что UNIX может работать значительно эффективнее, если в начале сеанса она «заморозит» определенные внутрен- ние таблицы, используемые для поиска имен команд (альтер- нативой выходу из системы может служить специальная команда, обновляющая содержимое внутренних таблиц); • нет существенной разницы между командами, определенными пользователями и встроенными командами. UNIX просто следует маршруту поиска, и ей совершенно безразлично, кто определил команду. Выпад против Дадли Мы можем воспользоваться нашими новыми знаниями о про- граммах оболочки и маршрута поиска для реализации команды, которая имеет двойное достоинство: во-первых, она играет роль иллюстративного примера и, во-вторых, заставляет на время замолчать Дадли (Dudley). Мы делаем следующее: Любой каталог $ cat >/usr/dudley/bin/cat ' echo Поражен страшной файловой молью Ad $ chmod 777 /usr/dudley/bin/cat $ Действие этой гнусной выходки (которая основана на велико- душном разрешении Дадли писать в его командный каталог bin) состоит в том, что, когда Дадли в следующий раз введет команду cat имя-файла он получит в ответ
Гл. 7. Команды и оболочка 121 Поражен страшной файловой молью Таким образом, создается впечатление, что содержимое всех его файлов затерто этим дурацким сообщением. На самом деле мы просто переопределили для Дадли ко- манду cat на echo Поражен страшной файловой молью Поскольку маршрут поиска Дадли проходит через его каталог bin раньше, чем через каталоги встроенных команд (как мы полагаем), то будет распознаваться новая команда cat, а не ис- тинная. Идея, проиллюстрированная этим примером, заклю- чается, следовательно, в том, что вы можете, если захотите, переопределить существующие команды UNIX — хотя обычно это делается для своей собственной выгоды, а не для розыгрыша друзей. Язык программирования оболочки Оболочка на самом деле предлагает довольно развитый язык программирования и поддерживает большинство языковых по- нятий, с которыми вы имели дело, если использовали, скажем, язык Бейсик. В частности, в языке оболочки имеются перемен- ные, операторы присваивания, условные операторы, циклы и т. д. Эта тема находится вне сферы данной книги, но, возможно, вас заинтересует следующий пример, демонстрирующий стиль программирования на языке оболочки. Уровень детализации в этом примере такой, что этот пример больше связан с оболочкой Баурна, а не с оболочкой С. if test Х$1 = X—w then shift /usr/bin/spel I else /usr/bin/spel 1 —b $* fi Эта новая команда реализует (realizes) мечту, или, точнее, осуществляет (realises) мечту. Эта наша новая команда spell с английским правописанием. Она находится в файле с именем spell в нашем каталоге bin и тем самым перекрывает старую с изъянами программу spell, расположенную в каталоге /usr/bin. Программы оболочки могут ссылаться на аргументы теку- щей команды. К первому аргументу обращаются в виде $1, ко второму — в виде $2 и т. д.; запись вида $ * означает все аргументы. Первая строка программы проверяет, является ли
122 Часть II. Приложение идей первый аргумент опцией —w. (Назначение литеры X объяснить на данном этапе довольно сложно; это такая особенность про- граммирования на языке оболочки, что если вы новичок, то будете рвать на себе волосы, пытаясь найти необычные способы борьбы с явно иррациональным поведением оболочки; X напи- сана лысым программистом.) Если первым аргументом является —w, то вызывается команда оболочки shift для сдвига аргумен- тов; аргумент —w пропадает, а второй аргумент нашей новой команды spell становится первым. Затем вызывается старая команда spell, и ей передаются оставшиеся аргументы новой ко- манды spell (без аргумента —w). Если аргумент —w не задан, то используется else — часть вышеприведенной условной команды if; это приводит к вызову старой команды spell с опцией —Ь, т. е. к запросу проверки анг- лийского правописания, и передаче ей всех аргументов, задан- ных в новой команде spell. В результате мы достигли желаемого эффекта: если пользователь не задаст нашей новой команде spell опцию —w, то она будет проверять английское правописание. Оболочка Баурна предоставляет множество других возмож- ностей, не охваченных этим примером. Вероятно, одна из наи- более интересных возможностей для начинающих — это исполь- зование встроенных переменных с фиксированным смыслом. В частности, НОМЕ означает имя личного каталога, PATH ваш маршрут поиска. Эти две переменные являются частью среды, которая опреде- ляет способ использования вами системы UNIX. Если вы на- берете команду set то получите распечатку вашей среды. Она включает значения переменных НОМЕ и PATH, имя используемой вами оболочки, литеры, используемые в качестве подсказок, и т. д. Можно изменить среду, задав новое значение переменной среды. Вы можете, например, установить новый маршрут поиска, присвоив переменной PATH значение, состоящее из последова- тельности имен каталогов, разделенных двоеточием. Если вы используете оболочку sh, то это делается командой PATH = . : $НОМЕ/Ып : /bin : /usr/bin Эта команда устанавливает маршрут поиска, состоящий из последовательности каталогов: (1) текущий каталог — по правилам UNIX он задается точкой; (2) каталог bin в вашем личном каталоге — вместо $НОМЕ подставляется имя вашего личного каталога;
Гл. 7. Команды и оболочка 123 (3) /bin; (4) /usr/bin. Когда вы будете набирать приведенную выше команду, не вво- дите пробелы; в действительности мы не должны были помещать их в текст команды, но сделали это для наглядности. Входные файлы пользователей Почти наверняка самым первым действием, которое вы совер- шили, когда начали использовать UNIX, было выполнение некоторой программы оболочки. Это вызвано тем, что каждый пользователь обычно имеет входной файл с именем .profile, содержащий программу оболочки, которая автоматически выпол- няется каждый раз, когда этот пользователь входит в систему. Ваш конкретный входной файл может определять ваш маршрут поиска, личный каталог, характеристики терминала, обычно используемые вами и т. д. В некоторых системах UNIX вы можете располагать также файлом .logout, который автоматически выполняется всякий раз, когда вы выходите из системы; этот файл может, например, делать чистку, уничтожая все файлы с определенными именами. (В некоторых реализациях UNIX имеются и другие файлы по- добного типа; с другой стороны, эти файлы могут иметь отличные от приведенных имена, например .login вместо .profile.) Вас может удивить, почему, если вы располагаете подобными файлами, вы их никогда не видите при выполнении команды 1s. Причина в том, что команда 1s обычно не выдает информацию о файлах, имена которых начинаются с точки. Поэтому внут- ренние механизмы системы UNIX, использующие входные файлы .profile и им подобные, скрыты от непосвященных пользователей. Если вы хотите взглянуть на скрытые файлы, задайте опцию —а (означающую «все») в команде 1s. В этом случае, если вы нахо- дитесь в своем личном каталоге, вы получите листинг такого вида: .profile filel file2 file3 в то время как без опции —а вы увидели бы только filel file2 file3 Здесь имеются три скрытых файла. ваш текущий каталог, .. ссылка на родительский каталог, .profile файл, выполняемый при каждом входе в систему. Вы можете, если хотите, редактировать входной файл .profile Можно, например, добавить в него команду
124 Ч асть II. Приложение идей echo Здорово приятель чтобы заставить UNIX, хотя и неохотно, печатать Здорово приятель при каждом вашем входе в систему. Более содержательный пример: вы можете устанавливать во входном файле переменные среды, чтобы настроить UNIX на желаемый стиль работы. Так, вы можете установить PATH таким образом, чтобы ваш командный каталог, а также, воз- можно, командные каталоги ваших друзей автоматически вклю- чались в ваш маршрут поиска. Резюме об оболочке По сравнению с большинством операционных систем оболочка UNIX располагает огромными возможностями и гибкостью. Для начала вы можете ограничиться использованием простей- ших средств, таких как переадресация, конвейеры и фоновые процессы. Однако, если вы стремитесь стать профессиональным программистом системы UNIX, стоит потратить час-два на изу- чение документации по используемой вами оболочке; эта доку- ментация может даться нелегко, но в конечном счете вы сумеете одолеть ее и познать спрятанные под замком богатства.
ГЛАВА 8 РЕДАКТИРОВАНИЕ Молчание — золото. Пословица Молчание —. отшл Задачи, которые должен выполнять редактор, до смешного про- сты: вставка и удаление литер в файле. Не с лучшей стороны нас характеризует то, что чем дело тривиальнее, тем боль- ше мы о нем спорим и занимаем более резкую позицию. Так, каждый имеет свой собственный неизменный взгляд на редак- торы, и все разработчики операционных систем реализовали свои собственные редакторы, отличные от других. К этим ре- дакторам пользователи операционных систем зачастую добав- ляли редакторы своей собственной разработки, и поэтому на каждой отдельной ЭВМ может быть «официальный» и плюс не- сколько неофициальных редакторов. В основном существуют два типа редакторов. Разница за- ключается в том, как пользователь определяет позицию, с кото- рой он хочет внести изменение (удаление или вставку). В одном типе редакторов пользователь перемещает курсор прямо по
126 Часть II. Приложение идей экрану, пока не установит его в нужном месте. Такие экранные редакторы популярны на микроЭВМ. В других редакторах позиция, подлежащая изменению, определяется контекстом (на- пример, я хочу изменить слово «to» в строке, которая содержит слово «unpalatable»). Контекстные редакторы, г. называемые также построчными редакторами, широко используются на больших центральных ЭВМ, а на многих терминалах, связанных с такими ЭВМ, фактически не допускается свободное переме- щение курсора, что не позволяет работать с экранным редакто- ром. «Официальный» редактор UNIX является контекстным ре- дактором и называется ed. Некоторые системы UNIX включают также «официальный» экранный редактор vi. Ваша конкретная система UNIX кроме официальных может содержать множество альтернативных редакторов. Одни из них базируются на редак- торе ed и часто имеют схожие с ed названия, например ет или ех. Другие редакторы полностью от них отличаются. Если вы хотите работать с одним из последних, удачи вам! Мы, конечно, понимаем, что пользование любым редактором — это временная мера; возможно, вы захотите разработать новый редактор, от- личный от всех существующих и лучше их. Но пока вы его не сделаете, вам придется иметь дело с существующей, хотя и худ- шей продукцией. Мы сконцентрируем внимание на редакторе ed, поскольку он доступен для всех типов терминалов. Более того, редактор vi включает средства редактора ed в качестве подмножества, по- этому знание редактора ed полезно даже в том случае, если впоследствии вы будете работать с редактором vi. (На самом деле один из вариантов редактора ed под названием ех — это фактически та же программа, что и vi.) В конце главы мы кратко рассмотрим экранные редакторы. Замечание для пользователей Бейсика Если вы писали программы на языке Бейсик, то знакомы с воз- можностями редактирования Бейсика. Однако эти знания вам не пригодятся при изучении редакторов общего назначения, таких как ed. Редактирование в Бейсике основано на том, что в начале каждой строки стоит ее номер, например, 100 PRINT "HELLO" Такие номера строк удобны для Бейсика, но нет никакой необ- ходимости, ни потребности вставлять номера строк, скажем, в текст приведенного нами бестселлера. Поэтому необходимо использовать другие способы редактирования.
Гл. 8. Редактирование 127 Действительно, очень небольшое число языков программи- рования, кроме Бейсика, имеют номера, которые встроены в строки. В большинстве языков программирования, включая Паскаль и Фортран, для внесения изменений в программы ис- пользуется редактор общего назначения. Поэтому редактор ed разрабатывался для редактирования как программ, так и обыч- ных текстов. Редактор ed П. Плоджер в своем обзоре в февральском (1982 г.) выпуске журнала Computing Reviews резюмирует редактор ed как «ре- дактор, предназначенный для глупых терминалов и умных людей». (Глупые терминалы — это терминалы с примитивными возможностями.) Должно быть, повсюду существует большое число глупых терминалов и умных людей, так как редактор ed был широко скопирован и в настоящее время кроме UNIX используется во многих других операционных системах. Излишне говорить, что каждая копня делалась людьми, имеющими собственное мнение насчет того, как следовало бы улучшить редактор ed. Поэтому у редактора ed имеются теперь сотни детей и внуков во всем мире, похожих друг на друга, но среди них нет двух одинаковых. В вашей системе UNIX может оказаться один из этих отпрысков редактора ed, а не сам ed, поэтому будьте го- товы к отклонениям от того, что излагается в книге. Настоящий редактор ed содержит несколько прекрасных примеров деятельности отшл. Каждый элемент диалога с редак- тором, будь то ваша команда или сообщение редактора об ошиб- ке, создает впечатление, что каждая набранная литера оцени- вается на вес золота. Многие команды редактирования, хотя они и без того короткие, могут быть еще более сжаты посред- ством умолчаний, предусмотренных в ed. При входе в редактор ed вы покидаете оболочку и начинаете набирать команды редактирования, а не команды оболочки. В UNIX имеется несколько других программ с подобными свойствами: так, если система UNIX, с которой вы работаете, включает систему Бейсик, то, войдя в Бейсик, вы начинаете вводить команды Бейсика, а не команды оболочки. Когда вы выйдите из редактора ed (или Бейсика), то вновь вернетесь в оболочку. Когда редактор ed хочет, чтобы вы ввели команду, он выдает любимую подсказку отшл: ничего. Следовательно, вы не должны ждать приглашения для ввода команды — надо просто набрать ее.
128 Часть II. Приложение идей Буфер Первое действие редактора — создание собственной копии ре- дакторского файла. Она называется буферной копией. Буфер (обычно) хранится в быстрой памяти, так что редактирование будет осуществляться быстро. Операции редактирования при- меняются к буферу, а не к исходному файлу. В конце сеанса редактирования необходимо записать буфер в файл. Обычно вы будете записывать буфер на место исходного файла, но ничто не помешает вам записать буфер в новый файл или даже на место некоторого другого файла. Если при редактировании вы окончательно испортили редактируемый текст, то можете со- всем не записывать буфер, а просто выйти из редактора; ника- кого вреда вашему файлу при этом не будет (пострадает только ваше самолюбие). Редактор используется не только для изменения существу- ющих файлов, но и для создания новых файлов. В этом случае буфер первоначально пуст. В любой момент редактирования имеется текущая строка, которую можно рассматривать как указатель, определяющий одну строку в буфере. Первоначально текущая строка — это последняя строка буфера. Когда вы вносите изменение, оно про- изводится в текущей строке. Простейший способ редактирова- ния состоит из двух шагов: (А) переместить текущую строку на строку, которую вы соби- раетесь изменить; (Б) провести изменение. Существуют три способа перемещения текущей строки: (1) с помощью задания числа. Оно считается номером строки внутри буфера. Так, если вы задали 45, то получаете 45-ю строку буфера. По соглашению, принятому в редакторе ed, если вы зададите точку, то это будет означать номер текущей строки; по другому соглашению знак доллара означает по- следнюю строку буфера; (2) путем контекстного поиска. В этом случае ed ищет строки, содержащие заданную цепочку (т. е. последовательность литер), и делает текущей строкой первую такую строку, которую он находит. По правилам редактора ed цепочки должны быть заключены между литерами «/». Так, если за- дать /pig/, то редактор будет искать строки, содержащие pig- (С другой стороны, в большинстве языков программи- рования цепочки заключаются в кавычки, например 'pig'.) Контекстный поиск цепочки начинается со строки, следу- ющей за текущей строкой; если редактор в процессе поиска
Гл. 8. Редактирование 129 доходит до конца буфера безрезультатно, он начинает поиск вновь с начала буфера и продолжает его, пока снова не до- стигнет текущей строки. Такой поиск называется цикличе- ским. Редактор прекращает поиск только после того, как сделан полный круг; (3) при помощи относительных величин. Вы можете расширить случаи (1) и (2), добавив числа со знаком плюс или минус. Например, /pig/ + 2 означает две строки за следующим появлением pig,, а /Summary/—12 означает 12 строк до следующего появления Summary. Особенно удобно использовать номера строк относительно текущей строки. Так, .+3 означает три строки за текущей строкой. На самом деле этим так часто пользуются, что отшл разрешил даже опускать точку и набирать просто +3. Однако мы не будем использовать это сокращение, так как оно на первых порах приводит к некоторой путанице. Начинающие всегда соблазняются методом (1) номеров строк. Этому соблазну, подобно всем искушениям, лучше всего не поддаваться, но этого не всегда удается избежать. Недостаток номеров строк в том, что они подходят только для очень корот- ких файлов. Если вы хотите изменить большой файл, то мало- вероятно, что вам заранее будет известно, что изменяемая по- зиция находится, скажем, в строке 1597. Существует к тому же еще одна проблема: номера строк изменяются. Так, если вы вставляете дополнительную строку перед строкой 3, то преды- дущая строка 3 становится строкой 4, строка 4 строкой 5, а строка 1597 станет строкой 1598. Если вы намереваетесь когда-нибудь использовать UNIX более чем тривиальным образом, избегайте соблазна использо- вания номеров строк и вырабатывайте привычку находить строки по контексту. Для того чтобы вы имели четкое представление о том, как установить текущую строку, мы приведем несколько примеров специально на эту тему: мы не будем пока делать каких бы то ни было изменений в буфере. Простейшие команды редактора ed состоят в установке текущей строки, за которой следует имя команды. Это имя представляется обычно одной буквой. 5 № 161
130 Часть II. Приложение идей Пример сеанса Мы покажем, как применять редактор на примере редактиро- вания файла chapterl нашего романа. Предположим, что этот файл остался нетронутым с тех пор, как мы создали его двумя главами раньше, и он все еще содержит следующий текст: Грег Деймлер вошел в комнату. На полу валялось десять трупов. Он кашлянул. Один труп свалился с книжного шкафа. Грег посмотрел вверх. Он увидел еще семь трупов, пригвожденных к потолку. Чтобы начать редактирование, мы набираем $ ed chapterl 186 Число, выводимое в ответ редактором, указывает число литер (или в некоторых реализациях — число строк) в файле. Мы называем редактируемый файл, в данном случае chapterl, текущим файлом. Наиболее частое действие, выполняемое начинающим пользо- вателем, состоит в выводе на экран текущей строки. Это един- ственное действие, которое мы будем выполнять в данном ввод- ном разделе. Поскольку это действие такое частое, оно в редак- торе ed представляется самым коротким именем команды: это имя не содержит ни одной литеры, т. е. является пустым. (Аль- тернативно можно использовать в качестве имени команды букву р (print — печать), если вам хочется быть многословным; ре- дактор ed использует слово «печать» в смысле «вывод на дисп- лей», и мы будем следовать в данной главе этому соглашению.) Поэтому, если вы просто устанавливаете текущую строку, набирая, например, 16 или /pig/, то на терминал выводится новая текущая строка. Теперь мы начнем наш сеанс редактирования. Мы раздро- бим этот сеанс на небольшие фрагменты, для того чтобы по ходу дела объяснять, что происходит. Каждый фрагмент начинается со строки вида: -► текст текущей строки чтобы было очевидно, какая строка является текущей. Однако заметим, что это особенность книги, а не самого редактора. Вначале, как мы предупреждали, текущей строкой является последняя строка буфера. -► пригвожденных к потолку,
Гл. 8. Редактирование 131 пригвожденных к потолку 1 Грег Деймлер вошел в комнату. На полу валялось десять /семь/ Грег посмотрел вверх. Он увидел еще семь трупов, .—2 Грег Деймлер вошел в комнату. На полу валялось десять Здесь мы печатаем четыре различные текущие строки. Вначале мы набираем точку, чтобы увидеть текущую строку, не переме- щая ее. При этом печатается последняя строка файла, бывшая первоначально текущей строкой. Затем мы перемещаем текущую строку на строку 1 только для того, чтобы подразнить вас. (На самом деле строка 1 яв- ляется единственным номером строки, которым регулярно поль- зуются даже люди, преданные контекстному поиску; часто не- обходимо сослаться на первую строку файла, и это — естест- венный способ сделать это.) В третий раз мы используем контекстный поиск. Редактор ed продвигает текущую строку на следующую строку, которая содержит слово «семь». Заметим, что ed рассматривает буфер просто как набор строк и все литеры внутри строк обрабаты- ваются одинаково. Строка не считается набором слов: так, если вы ищете семь, то можете не получить строку, содержащую слово «семь»; вместо этого редактор может найти «семь» в словах «семья» или «восемь». Но в приведенном примере мы действи- тельно находим слово «семь». Наконец, мы делаем текущей строку, расположенную двумя строками выше, и фактически вновь переходим к первой строке. Мы приведем теперь еще три примера контекстного поиска, чтобы проиллюстрировать несколько характерных моментов. Грег Деймлер вошел в комнату. На полу валялось десять /л е/ Грег, посмотрел вверх. Он увидел еще семь трупов, /Один/ трупов. Он кашлянул. Один труп свалился с книжного шкафа. /Один/ трупов. Он кашлянул. Один труп свалился с книжного шкафа. Первая строка показывает, что все литеры обрабатываются одинаковым образом: в частности, пробел не отличается от любой другой литеры и поэтому может быть включен в кон- текстный поиск. Цепочка /ле/ s*
132 Часть II. Приложение идей ищет букву л, за которой расположен пробел, за которым сле- дует буква е. Первый поиск слова Один показывает цикличность поиска: когд'а начался поиск, мы находились на третьей строке буфера, но поиск дошел до конца буфера, а затем вновь начался с на- чала, прежде чем добыча была найдена во второй строке. Когда мы снова ищем слово Один, то совершаем полный цикл. Слово Один содержится только в одной строке, поэтому поиск делает полный круг, пока вновь не попадет на ту же самую строку. В заключение мы сделаем несколько ошибок и покажем мощь редактора ed при выдаче сообщений об ошибках. трупов. Он кашлянул. Один труп свалился с книжного шкафа. золото ? /золото/ ?? В первой строке мы хотели написать /золото/, но по ошибке набрали золото. Это не является командой редактора, поэтому отшл насмешливо задает вопрос «?». Затем мы ищем цепочку золото, которой в буфере нет. Поэтому редактор осуществляет полный просмотр буфера и все равно поиск мишени оканчива- ется неудачей. Отшл, взбешенный этим напрасным поиском, вдвое больше многословен, чем ранее. Два сообщения «?» и «??» плюс несколько сообщений, каса- ющихся файлов,— вот и все, что может сказать ed. Вы никогда не получите каких-либо других сообщений об ошибках (если только ваш ed не является адаптированной версией). Поэтому убедитесь, что вы правильно понимаете синтаксис, прежде чем будете им пользоваться; вы не получите какой-либо помощи, если допустите ошибку. Именно по этой причине мы пока что закончили только введение в редактирование, хотя уже сильно углубились в главу, и только теперь готовы описать, как про- водить изменения в тексте, находящемся в буфере.
Гл. 8. Редактирование 133 Некоторые изменения В буфере можно делать два вида изменений: • вы можете вставлять или исключать целые строки; • вы можете заменить одну цепочку на другую внутри строки. Вначале мы рассмотрим первый вид изменений. Для изменения целых строк служат четыре команды: d исключить текущую строку; i вставить перед текущей строкой; а добавить за текущей строкой (т. е. вставить за ней); с заменить текущую строку, т. е. исключить ее и поместить на ее место другие строки. Для всех этих команд, кроме первой, необходимо задать строки, которые должны быть добавлены. Во всех случаях вы можете добавить столько строк, сколько хотите. Чтобы указать конец добавляемого текста, вы набираете строку, состоящую из одной точки. Мы проиллюстрируем эти возможности прежде всего добав- лением нескольких новых строк к концу буфера. -► трупов. Он кашлянул. Один труп свалился с книжного шкафа. $ пригвожденных к потолку. а В этот момент открылась дверь. В комнату вошла высокая и потрясающе красивая девушка. На ней было короткое и очень узкое платье. В данном фрагменте вначале мы устанавливаем текущую строку на последнюю строку буфера, набирая знак доллара, и затем добавляем три новые строки. После того как текст добавлен к буферу, редактор устанавливает текущую строку на последнюю строку буфера, набирая знак доллара, и затем мы добавляем три новые строки. После того как текст добавлен к буферу, ре- дактор устанавливает текущую строку на последнюю из вновь добавленных строк. Вы видите, что ed имеет два режима работы. Большую часть времени редактор находится в командном режиме, в котором он воспринимает набираемые вами строки как команды (на- пример, передвинуть текущую строку или внести изменения). После того как вы наберете команду i, а или с, редактор изме- няет режим и воспринимает ваши входные строки как добав- ление к буферу. Когда вы набираете точку, ed возвращается в командный режим. (Характерной чертой редактора ed явля-
134 Часть II. Приложение идей ется то, что, когда ему необходима литера специального назна- чения, его первым выбором является точка: мы уже видели, что точка в качестве номера строки означает текущую строку, а точка на строке сама по себе завершает текст, который должен быть добавлен к буферу. Точка используется и в других слу- чаях, о которых мы скажем позднее.) В редакторе ed есть два Особенно скользких места, которые опасны для начинающих. Одно из них — это точка, завершаю- щая вставленный текст. Ошибка многих начинающих — а также специалистов — состоит в том, что они периодически забывают ввести точку. -► На ней было короткое и очень узкое платье. .—2 В этот момент открылась дверь. i Часы пробили три. Здесь перед текущей строкой мы вставляем новую строку, име- ющую важное значение для сюжета романа. Сделав это, мы вспоминаем затем, что для сюжета важно также то, что трактор остановился раньше, чем пробило три часа, поэтому мы встав- ляем еще одну строку: i У трактора во дворе заглох двигатель. К счастью, в этот момент мы решаем посмотреть на наше творение и распечатываем буфер. Что же мы видим: Грег Деймлер вошел в комнату. На полу валялось десять трупов. Он кашлянул. Один труп свалился с книжного шкафа. Грег посмотрел вверх. Он увидел еще семь трупов, пригвожденных к потолку. Часы пробили три. i У трактора во дворе заглох двигатель. В этот момент открылась дверь. В комнату вошла высокая и потрясающе красивая девушка. На ней было короткое и очень узкое платье. (Мы вскоре объясним, как печатать буфер.) Буфер содержит не то, что мы ожидаем, и обнаруживается коварство скользкого места: мы соскользнули в другой мир, не подозревая об этом. Это произошло потому, что мы забыли набрать точку после первой вставки, в результате чего вторая вставка воспринялась как часть данных первой вставки.
Гл. 8. Редактирование 135 Мы исправим эту оплошность, исключив строку, которая содержит букву i; эта строка расположена перед текущей (мы полагаем, что текущая строка после распечатки буфера восста- новлена прежней). После исключения строки, содержащей i, мы исключаем также строку о тракторе. У трактора во дворе заглох двигатель. .—1 i d d После выполнения команды d текущая строка устанавливается на строку, следующую за исключенной. Поэтому повторное выполнение команды d исключает последовательные строки. Теперь мы вновь вставим строку о тракторе на предназна- ченное для нее место — перед строкой, в которой говорится, что пробили часы. -► В этот момент открылась дверь. .-1 Часы пробили три. i У трактора во дворе заглох двигатель. Теперь буфер содержит: Грег Деймлер вошел в комнату. На полу валялось десять трупов. Он кашлянул. Один труп свалился с книжного шкафа. Грег посмотрел вверх. Он увидел еще семь трупов, пригвожденных к потолку. У трактора во дворе заглох двигатель. Часы пробили три. В этот момент открылась дверь. В комнату вошла высокая и потрясающе красивая девушка. На ней было короткое и очень узкое платье. (На самом деле не было необходимости исключать строку о тракторе и вставлять ее вновь. Можно было бы использовать специальную команду редактора ed, которая перемещает строки с одного места на другое.) Таким образом нам довольно легко удалось выпутаться из ситуации, вызванной пропуском точки в конце вставляемого текста. Но так везти вам будет не всегда. Если вы работали в течение получаса в редакторе ed, не получая какого-либо ответа, то вполне вероятно, что в каком-то месте была пропущена точка.
136 Часть II. Приложение идей Поэтому существует хорошее правило при работе с ed: точка удаляет сомнения. Если вы уже находитесь в командном режиме, то точка просто будет печатать текущую строку, и это убеж- дает вас, что все идет нормально. Если вы работаете не в ко- мандном режиме, то точка переведет вас в этот режим. Достигнув стадии, на которой вы теперь можете выполнять простые редактирующие действия, мы прервем на время наш сеанс редактирования и рассмотрим несколько общих свойств редактора ed. Общий вид команды Пока что мы рассматривали установку текущей строки отдельно от выполнения команд, таких как i, которые изменяют буфер. Теперь, когда вы приобрели некоторую уверенность в работе с ed, можно объединить их. В общем случае команда редактора ed имеет вид: [адрес [,адрес]] имя-команды [аргумент] где адрес является спецификацией строки и аналогичен специ- фикациям, которыми мы пользовались для установки текущей строки. Как видите, имени команды предшествует нуль, один или два адреса. Большинство команд, как будет показано ниже на примерах, допускают любую из этих трех возможностей. Если не задано ни одного адреса, используется подразумеваемое значение — обычно адрес текущей строки. Пара адресов об- разует адресный диапазон и означает, что команда должна применяться ко всем строкам от начала адресного диапазона до его конца включительно. Мы проиллюстрируем общий вид команд на ряде примеров использования d .+2d команды d, которая исключает строки исключить текущую строку; продвинуть текущую строку на две вперед, а затем исключить новую текущую строку; продвинуть текущую строку до следующей строки, содержащей слово Деймлер, и исклю- чить эту строку; исключить строки с 3 по 5 включительно; исключить все строки, начиная с текущей и кончая следующей строкой, содержащей слово Деймлер; исключить весь буфер. к этим примерам: /Деймлер/d ' 3,5d .,/Деймлер/d l,$d Два замечания • вы можете, если хотите, добавлять пробелы перед d, например 3,5 d;
Гл. 8. Редактирование 137 • хотя во всех наших примерах приводится команда d, многие другие команды редактора имеют такие же альтернативные формы, и мы могли бы с тем же успехом воспользоваться, скажем, командой с. Одной из команд, которую особенно удобно применять с парой адресов, является команда р, которая печатает строки. В частности, команда 1,$р печа- тает весь буфер — (операция, использовавшаяся выше в примере), а команда 3,5р печатает строки с 3 по 5 включи- тельно. Запись в файл Многие пользователи редактора, зная, что в любой момент может произойти какая-нибудь авария, периодически записывают буфер в текущий файл. В этом случае их работа будет сохра- нена, и если в дальнейшем с буфером произойдет какая-либо беда, они могут просто отказаться от буфера с гарантией, что по крайней мере некоторая часть их работы окажется спасенной. Для записи буфера используется команда w. Если вы просто наберете команду w то она запишет в текущий файл весь буфер. Текущий файл за- дается обычно именем файла, которое вы указываете в исходной команде ed, например, ed chapter2 (Существует несколько способов изменения имени текущего файла, но эти вопросы не входят в сферу данной книги.) Команда w — это необычная команда: она по своей инициа- тиве выдает некоторое сообщение. После того как команда записала файл, а это может потребовать время, если буфер большой, она сообщает вам, причем абсолютно добровольно, число записанных ею литер (а в некоторых версиях ed число записанных строк). Команда w имеет также и вторую особенность: если вы не задаете ни одного адреса, то предполагается, что запись должна применяться ко всему буферу. Так происходит, например, в приведенном выше примере. С другой стороны, большинство команд редактора ed по умолчанию предполагает текущую строку. Таким образом, к счастью для нас, команда d исклю- чает не весь буфер, а только текущую строку. Участие отшл в разработке редактора ed привело к тому, что по умолчании подразумевается эта наиболее употребитель- ная ситуация. Только w и горстка других команд редактора ed чаще всего применяются ко всему буферу.
138 Часть II. Приложение идей Вы всегда можете отвергнуть подразумеваемый адресный диапазон, задав перед командой один или два явных адреса. Так, команда .—lw передвинет текущую строку на одну строку назад и запишет ее (и ничего больше) в текущий файл. (Это скорее всего ошибка, если только остаток буфера не записывается отдельно, так как все остальное будет потеряно.) Команда 1,/Деймлер/\у демонстрирует использование команды записи применительно к диапазону строк. Она записывает строки с начала буфера — по первую строку, содержащую слово Деймлер, включительно. Эта последняя строка становится затем текущей. Команда w имеет также необязательный аргумент. Если вы хотите оставить текущий файл без изменений, а запись сделать в другой файл, то можете использовать команды вида w newcopy 6w Ппеб 1,/Daimler/w uptoDaimler Первая команда записывает весь буфер в файл newcopy; вторая команда пишет шестую строку буфера в файл Ппеб; третья команда записывает диапазон строк в файл uptoDaimler. (За- метьте, что необходимо вставить как минимум один пробел между w и именем файла, следующим далее,— это одно из немногих мест в редакторе ed, где пробел обязателен.) Команда w до- вольно жесткая: если файл с заданным именем уже существует, то она записывает в него новую информацию, разрушая преж- нее содержимое файла. В качестве альтернативы для w часто удобно применять команду W, которая добавляет текст в конец файла, а не переза- писывает его. (В некоторых реализациях используется команда wa, а не W.) Изменения внутри текущей строки Ранее мы отмечали, что существуют два вида изменений, которые можно делать в файле: вставка или исключение целых строк и изменения внутри строки. Пока что мы рассмотрели только первый вид изменений, осуществляемый такими командами, как i и d. Этот способ редактирования наиболее часто применяют, когда редактируемым текстом является программа. Когда вы редактируете настоящий текст, особенно если вносите изменения
Гл. 8. Редактирование 139 в существующий документ, намного удобнее изменять отдельные слова или фразы внутри строки, а не уничтожать или создавать строки целиком. Итак, наступила самая пора объяснить, как проводить изменения внутри строки. Для этого в редакторе ed служит команда s, общая форма которой имеет вид ь/образец/замена/р Пока мы будем считать образец и замену простыми цепочками литер. Действие s состоит в замещении первого вхождения цепочки образец на цепочку замена внутри текущей строки. Ко- манда р на конце является необязательной и вызывает печать текущей строки после того, как произведена замена. (Это при- мер более общего свойства: можно добавлять команду р, которая печатает текущую строку, к ряду команд редактора. Таким образом вы получаете две команды за ту же цену.) Теперь мы вернемся к нашему сеансу редактирования и поработаем с командой s. -► У трактора во дворе заглох двигатель. 1 Грег Деймлер вошел в комнату. На полу валялось десять s/десять/18/р Грег Деймлер вошел в комнату. На полу валялось 18 Здесь мы устанавливаем текущую строку на первую строку буфера и изменяем десять на 18. Для многих пользователей команда s — наиболее употреби- тельная команда редактора, поэтому мы приведем еще несколько примеров ее использования. -► Грег Деймлер вошел в комнату. На полу валялось 18 8/Деймлер//р Грег вошел в комнату. На полу валялось 18 Мы применяем здесь команду s к текущей строке и заменяем слово Деймлер пустой цепочкой, т. е. удаляем его. Теперь мы замечаем, что перед словом «вошел» оказались два пробела. Чтобы оставить один пробел, вводим команду s/ / / Эта команда замещает (первую) пару пробелов в строке одним пробелом. Мы опустили р на конце, поскольку уверены, что команда сработает правильно. (Заметим, что здесь, как и везде в редакторе, пробел обрабатывается как любая другая литера.)
140 Часть II. Приложение идей Вы можете добавить к команде s суффикс g (наряду с суф- фиксом р или вместо него) если хотите, чтобы были заменены все вхождения образца, хотя это все еще относится только к текущей строке. -► Грег вошел в комнату. На полу валялось 18 s/o/O/gp Грег вОшел в кОмнату. На пОлу валялОсь 18 Здесь мы заменяем каждую букву о в текущей строке на букву О. Эта замена весьма странная, но она дает нам возможность продемонстрировать команду, составляющую ценный противовес команде s. Если вы наберете команду u (undo — отмена), то дей- ствие предыдущей команды s будет отменено. Грег вОшел в кОмнату. На пОлу валялОсь 18 и Грег вошел в комнату. На полу валялось 18 Этим действием мы отменяем замену о на О и печатаем те- кущую строку, чтобы убедиться, что предыдущая замена дей- ствительно отменена. К сожалению, команда и отменяет только последнюю про- веденную замену и применима только к текущей строке. Вы не можете (если не располагаете суперрасширенной версией ed) отменить результат действия других команд, таких как траги- ческая l,$d в которой вместо р вы случайно набрали d и уничтожили весь буфер, вместо того чтобы его распечатать. Наконец, существует специальный способ объединения s с контекстным поиском. Пара команд /зеленый/ s/зелен ы й/голубой/ которая находит ближайшее вхождение слова зеленый, а затем заменяет его на голубой, может быть сокращенно записана как /зеленый/ з//голубой/ Общее правило таково, что пустой образец означает образец, который вы использовали в последний раз. Вот другой пример применения этого метода, в котором редактор применяется к файлу с детскими стишками:
Гл. 8. Редактирование 141 /хрюша/ Маленький хрюша ушел на базар. // Маленький хрюша дома сидел. В данном случае, найдя одно слово хрюша, мы хотим найти следующее его вхождение. Все, что нам для этого нужно,— это набрать //. Выход из редактора Команда, которую начинающие пользователи ed стараются набрать пораньше,— это команда q, которая означает, что сеанс редактирования окончен и настало время покинуть редак- тор. Выйдя из редактора, вы возвращаетесь затем к нормаль- ному командному режиму оболочки. Таким образом, вы полу- чаете приглашение $ и можете снова набирать обычные команды UNIX, а не команды редактора. (В более общем случае ввод буквы q в UNIX зачастую слу- жит хорошим средством, когда дела идут из рук вон плохо. Соглашение о том, что q означает выход (quit), относится не только к редактору, но и ко многим другим программам UNIX.) Нормальный способ окончания работы с редактором — это набрать w q чтобы записать буфер назад в текущий файл, а затем выйти. В некоторых реализациях эти команды можно записать в виде одной: wq. Если вы попытаетесь выйти из редактора, сделав изменения в буфере после последней команды w, то эти изменения будут потеряны. Это происходит в двух случаях: • Великий вредитель выходит из редактора, после того как вы потратили два часа на редактирование буфера и затем забыли записать эти изменения обратно в текущий файл; • позорный выход, когда вы внесли такую неразбериху при редактировании, что хотите выйти, не изменяя своего исход- ного файла. В любом случае редактор спрашивает вас, действительно ли вы хотите выйти. (Он, естественно, не может различить эти два случая.) В дружелюбных реализациях редактор печатает сообщение типа «уверены?», и вам приходится дать точный ответ у (т. е. да), если вы находитесь в позорном состоянии и действительно хотите выйти. В менее дружелюбных реализациях
1очь и. Приложение идей отшл просто выдает свое обычное сообщение об ошибке «?» при первой попытке выйти из редактора, но если вы пытаетесь выйти повторно, то выход срабатывает. Просмотр и останов Когда вы редактируете файл, то иногда можете весьма смутно представлять себе его содержимое. Это, например, может отно- ситься к старому файлу, очень большому файлу или к файлу, созданному кем-либо другим. Поэтому часто бывает удобно ис- пользовать редактор для просмотра буфера, чтобы получить представление о том, что он содержит. Можно использовать, например, контекстный поиск для поиска определенных слов. Иногда вам хочется просмотреть часть файла строка за стро- кой. Это можно сделать, набирая последовательно •+1 Однако отшл находит, что это громоздко, и обеспечил альтер- нативную форму, которая сокращена максимально: если вы наберете пустую строку, т. е. просто нажмете клавишу возврата каретки, то отшл интерпретирует это как . + 1. Поэтому для просмотра буфера строка за строкой вы просто держите нажатой клавишу возврата каретки. Когда вы дойдете до конца буфера, отшл ответит знаком вопроса, если вы попытаетесь продолжить дальше. Если вы хотите взглянуть на последовательность строк, окружающих текущую строку,— картинка, которую вы наблю- даете в экранном редакторе,— то можете набрать такую команду 10,.4-10р В связи с тем что это очень частая операция, некоторые версии ed содержат специальную команду для той же цели. На самом деле специальная команда даже лучше, так как в отличие от приведенного выше использования команды р она оставляет текущую строку на том же месте. Иногда во время просмотра вам может понадобиться узнать номер текущей строки, чтобы, например, сослаться на эту строку в последующей команде d. Для этого вы можете набрать В ответ выдается номер строки. Иногда в буфере могут встречаться литеры, которые нельзя увидеть. Примером служат литеры табуляции и возврата на шаг. Очень вероятно, что начинающие будут обескуражены такими невидимыми рифами. Если вы хотите точно узнать, что действительно содержится в ваших строках, то можете набрать
Гл. 8. Редактирование 143 вместо р команду 1, чтобы вывести эти строки. Команда 1 вы- водит что-нибудь видимое для каждой литеры, хотя точный вид того, что она выводит вместо невидимых литер, зависит от вашей версии редактора ed. Типичное соглашение таково: табуляция выводится как > возврат на шаг выводится как < Другие непечатные литеры выводятся в виде обратной косой черты, за которой следует внутренний код этой литеры. Однако обычно начинающий не интересуется деталями, ему достаточно знать, что в строке оказались некоторые экзотические литеры, которые нуждаются в замене. Для просмотра всего файла можно набрать команду 1,$р но если файл содержит 10 000 строк, то вы можете пожалеть о том, что сделали это: вывод на дисплей займет много времени. К счастью, при работе с редактором, вы можете нажимать на клавишу останова без каких-либо катастрофических послед- ствий. Нажатие этой клавиши просто возвращает вас в команд- ный режим редактора. Выполнение текущей команды прекра- щается, а буфер остается в состоянии, в котором он был, когда вы нажали на клавишу останова. Следовательно, останов можно использовать, чтобы завершить утомительное и нежелательное распечатывание, запущенное вами. Такое использование клавиши останова находится в конт- расте с рядом других программ UNIX, в которых останов пре- кращает всю работу и возвращает вас в оболочку. Полные примеры Так как наше описание команд редактора растянулось на не- сколько страниц, то, возможно, будет полезным проанализиро- вать несколько полных примерных сеансов, чтобы посмотреть, как эти команды используются совместно. Ниже мы приведем пять примерных сеансов. Первый пример иллюстрирует исполь- зование редактора ed для создания нового файла. Пример сеанса 1 $ ed а Когда Грег Деймлер очнулся, то обнаружил, что находится в темной комнате. Он почувствовал запах газа: нового ужасающего нервно-паралитического газа, который в секунду мог уничтожить миллион человек. Но не стоит беспокоиться. Газ мог уничтожить миллион обычных
144 Часть II. Приложение идей людей, но рядовые люди не обладают такими нервами, как Грег Деймлер. Деймлер просто улыбнулся. Газ уничтожил всех ядовитых змей и скорпионов, окружавших его. /темной/ в темной комнате. Он почувствовал запах газа: s/темной/небольшой темной/р в небольшой темной комнате. Он почувствовал запах газа! w chapter2 431 q $ Здесь мы начинаем вторую (chapter2) главу книги. Так как файл еще не существует, мы не задаем в команде ed аргументов. Когда мы подходим в конце работы к команде w, мы задаем имя файла, в который хотим сделать запись. При создании нового файла первой вашей командой является неизменно команда а, так как буфер пуст и кроме добавления к нему больше делать нечего. В приведенном выше сеансе мы заметили ошибку, после того как набрали новый текст. Слова «в темной комнате» следо- вало бы заменить на «в небольшой темной комнате». Поэтому мы использовали команду s, чтобы внести это изменение, прежде чем записать файл. В данном случае команда s использовалась для вставки нового слова, а не для замены чего-либо, но этот способ вставки существенно не отличается от замены. (Выше- приведенную команду s сокращенно можно записать в виде sZ/небольшой темной/p, так как слово темной уже найдено при контекстном поиске.) Достоинство применения ed, а не cat при создании нового файла состоит в том, что вы можете по ходу дела вносить изме- нения, подобные приведенному выше. Пример сеанса 2 В приведенном выше сеансе можно было бы в первой строке задать $ ed chapter2 а предпоследней командой — команду w вместо w chapter2 Это связано е тем, что если ed вызывается с несуществующим файлом в качестве параметра, каким, как мы полагаем, является chapter2, то он просто печатает свое излюбленное сообщение об ошибке — знак вопроса и продолжает работу точно так же,
Гл. 8. Редактирование 145 как если бы редактировался пустой файл. Однако имя файла запоминается и считается именем текущего файла; поэтому команда w в нашем примере пишет в файл chapter2. Хотя этот способ создания нового файла лишь незначительно отличается от метода сеанса 1, некоторые пользователи пред- почитают его. Если вы используете метод сеанса 1, то сущест- вует небольшая опасность, что после изнурительного сеанса редактирования вы забудете, какой файл предполагали создать. Пример сеанса 3 $ ed chapter2 431 li ДЕЙМЛЕР СЕРДИТСЯ w 449 q $ В данном случае мы добавляем заголовок в начало файла. За заголовком следует пустая строка. Затем мы записываем буфер назад в исходный файл. (Разница в числах 449 и 431 подсказы- вает нам, что файл теперь на 18 литер длиннее.) Пример сеанса 4 $ ed chapter2 449 /уничтожить/ в секунду мог уничтожить миллион человек. Но не стоит /уничтожить/ беспокоиться. Газ мог уничтожить миллион обычных 8//поразить/р беспокоиться. Газ мог поразить миллион обычных /уничтожить/ в секунду мог уничтожить миллион человек. Но не стоит W 447 q $ В данном случае нас слегка обеспокоило повторное использо- вание слова уничтожить. Мы находим оба употребления этого слова и меняем второе на поразить. Затем мы осуществляем поиск следующего слова уничтожить и .видим, что, совершив
146 Часть II. Приложение идей цикл, вновь вернулись к первому слову. Таким образом, это слово в тексте встречается только один раз. Счастливые, мы записываем файл и выходим из редактора. Пример сеанса 5 $ ed chapter2 447 1 ДЕЙМЛЕР СЕРДИТСЯ 4* здесь введена пустая строка здесь введена пустая строка Когда Грег Деймлер очнулся, то обнаружил, что находится . -1 ,$с ... ЕСЛИ ТЫ ХОЧЕШЬ ПРОЧИТАТЬ ОСТАВШУЮСЯ ЧАСТЬ, ИЗВОЛЬ КУПИТЬ МНЕ ТЕННИСКУ С НАДПИСЬЮ f—LOVE—UNIX. i,$p ДЕЙМЛЕР СЕРДИТСЯ Когда Грег Деймлер очнулся, то обнаружил, что находится ... ЕСЛИ ТЫ ХОЧЕШЬ ПРОЧИТАТЬ ОСТАВШУЮСЯ ЧАСТЬ, ИЗВОЛЬ КУПИТЬ МНЕ ТЕННИСКУ С НАДПИСЬЮ I—LOVE—UNIX w/usr/friend/thril Is 172 q $ Данный сеанс мы начинаем с печати строки 1. Затем просмат- риваем буфер, вводя две пустые строки. (Так как вторая строка буфера пустая, ответом на первую пустую команду служит пустая строка. Поэтому на экране появляется три последова- тельные пустые строки.) Когда мы доходим до первой строки рассказа, мы заменяем все строки, расположенные за ней, предложением, от которого вряд ли кто-нибудь откажется, и записываем буфер в личный каталог нашего друга (наш друг дал нам разрешение на запись в свой личной каталог). Мы не записываем этот буфер в текущий файл chapfer2, так как не хо- тим портить исходный текст.
Гл. 8. Редактирование 147 Регулярные выражения Вторым скользким методом в редакторе ed является метали- тера: литера, которая является не тем, чем кажется. Это скользкое место возникло как результат одного из самых обычных явлений в информатике: некое простое средство де- лается намного более общим и мощным; возникает, однако, одна небольшая проблема: это простое средство больше не является простым. В данном случае это явление проявилось в связи с контекст- ным поиском. Когда вы проводите такой поиск, вы в действи- тельности ищете образец. В приведенных простых примерах этот образец до сих пор состоял только из фиксированных литер, например /темной/. Однако образец может содержать и перемен- ные элементы. Такие переменные элементы указываются с помощью металшпер — литер, имеющих особый смысл. Мы уже видели использование металитер в оболочке. Металитерами оболочки являются такие литеры, как * и ?. Однако металитеры редактора ed сильно отличаются от металитер оболочки. Ниже приводится список некоторых металитер редактора: означает любую литеру. (Точка, как известно, в ре- дакторе ed является первейшим кандидатом на роль литеры специального назначения.) Так, /сЛ/ со- поставляется cat, czt, c + t и т. д.; х» здесь х—любая литера; означает любое число литер х, в том числе и нуль. Так, цепочке /ab*d/ соответст- вует любая комбинация вида ad, abd, abbd и т. д. Аналогично, /a.*d/ сопоставляется с любой цепочкой, начинающейся с а и оканчивающейся на d; (следует иметь в виду, однако, что and должны быть в од- ной и той же строке, поскольку ed — построчный редактор. Если в строке более одной литеры а или d, то /a.«d/ сопоставляется с цепочкой, начинающейся первой литерой а и оканчивающейся последней ли- терой d); $ обозначает конец строки. Так, /d$/ сопоставляется с литерой d в конце строки. Такое использование $ в чем-то аналогично применению $ для обозначения последней строки буфера, например 1,$р; Д обозначает начало строки. Так, /ДТ/ сопоставляется с Т в начале строки; /Д$/ сопоставляется с пустой строкой; [АаЬ] обозначает или А, или а, или Ь. (Это один из слу- чаев, когда металитеры редактора и оболочки интер- претируются одинаково.)
148 Часть II. Приложение идей [ДАаЬ] означает любую литеру, отличную от литер А, а и Ь. Такое применение [Д, означающее «ни одно из», пол- ностью отличается от предыдущего использования Д для обозначения начала строки; [ ,;]* означает любую последовательность (включая пустую), составленную из пробелов и (или) запятых и (или) точек с запятой. Образцы, которыми вы пользуетесь при контекстном поиске, называются регулярными выражениями. (Термин, использу- емый в математическом анализе синтаксиса; этот термин не вы- думан разработчиками редактора ed — иначе он имел бы более короткое имя). Необходимо помнить о следующих особенно- стях регулярных выражений: • первое знакомство начинающего с металитерами часто воз- никает тогда, когда он использует их случайно, и при этом происходят странные вещи. Так, он набирает /щи./, чтобы найти слог щи, за которым следует точка, и удивляется, когда редактор находит строку, содержащую вместо этого текст щим (Точка сопоставляется с любой литерой); • если вы действительно хотите, чтобы литера означала саму себя, можете набрать перед ней обратную косую черту, подобно тому как мы использовали обратную косую черту в оболочке. Так, приведенный выше образец /щи./ следо- вало записать в виде /щи\./; • регулярные выражения и металитеры используются в не- скольких программах системы UNIX. Некоторые про- граммы, например grep, используют такие же металитеры, как и редактор. Мы вскоре обсудим такое расширенное использование grep; • все регулярные выражения сопоставляются с текстом внут- ри текущей строки. Нельзя сопоставить образец с цепочкой, которая продолжается на нескольких строках; • регулярные выражения можно использовать не только при контекстном поиске, но и как образец в команде s. Примеры регулярных выражений Ниже мы приводим несколько примеров использования регуляр- ных выражений. Пример 1 /[Оо]н/ находит следующее вхождение Он или он. Заметим, что ре- дактор различает прописные и строчные буквы. Поэтому, если
Гл. 8. Редактирование 149 вы производите поиск всех вхождений местоимения «он», не забудьте включить в поиск также «Он». Пример 2 s/:.*$/:/p В данном случае регулярное выражение используется в коман- де s. Этому регулярному выражению соответствует цепочка, начинающаяся с первого двоеточия в текущей строке, и продол- жающаяся до конца текущей строки. Она заменяется двоеточием, поэтому окончательным результатом этого действия является удаление всего, что находится после первого двоеточия в строке. (Если текущая строка не содержит двоеточия, ed выдаст сооб- щение об ошибке «??», которое он всегда выдает при неудачном завершении поиска цепочки или образца.) Пример 3 Заметим, что знак Д не означает первую литеру строки. Вместо этого его можно рассматривать как воображаемую ли- теру, предшествующую первой литере строки. Эта разница имеет важное значение, когда вы делаете замену. Так, если текущая строка содержит Грег испугался то замена Д работает следующим образом: я/Д/'/р Трег испугался В данном случае мы заменяем воображаемую литеру в начале строки на кавычку. Остаток строки остается без изменения. (На самом деле воображаемая литера остается неизменной, так как ed всегда предполагает, что она существует.) С другой стороны, рассмотрим -> Грег испугался s/./‘/p ‘per испугался Здесь точке соответствует первая литера строки и она заменяется. Пример 4 Знак $ в конце строки играет ту же роль, что и вообража- емая литера Д в начале строки. Он часто полезен в качестве объекта замены, например, -> Грег испугался s/ф/зря/р Грег испугался зря
150 Часть II. Приложение идей Обратите внимание на пробел перед словом зря в вышеприве- денной замене. Если бы мы его не указали, то получили бы Грег испугалсязря Пример 5 s/A *// удаляет все пробелы в начале текущей строки. Пример 6 s/ #// ' Может показаться, что эта команда удаляет самую левую по- следовательность пробелов в текущей строке. На самом деле ее действие идентично примеру 5. Если текущая строка не начи- нается с пробела, то образец в точности сопоставляется с пустой цепочкой в начале строки. Команда заменяет эту цепочку пустой цепочкой, оставляя в итоге все как есть. Сделав эту нелегкую замену, она больше ничего не делает; следовательно, она не ищет последующие пробелы в строке. Мораль: остерегайтесь использовать металитеру звездочка, если начало повторений четко не выделено, в противном случае нужно быть очень ум- ным, чтобы предсказать, что произойдет. (Правильным образцом для нашей замены являются два пробела, за которыми следует звездочка,— это означает, что за одним пробелом следует нуль или несколько других пробелов.) Область действия металитер редактора и оболочки Отметим, что металитеры редактора действуют только в регу- лярных выражениях, заключенных внутри знаков /. Они не имеют силы где-либо еще в редакторе и неприменимы в команде оболочки. Точно так же металитеры оболочки не действуют в командах редактора. Поэтому, если cat ve* используется в оболочке, можно сконкатенировать файл с име- нем verylongname. Но вы не можете воспользоваться w ve* как командой редактора, чтобы сделать запись в этот же файл. Вы должны в этом случае написать имя файла полностью.
Гл. 8. Редактирование 161 Использование амперсанда при заменах В редакторе ed есть еще одно место, где литера означает не то, чем она кажется: литера амперсанд в цепочке замены команды s означает образец, с которым было сделано сопоставление. Так, s/темной/неболыной &/ означает то же самое, что и s/темной/небольшой темной/ Использовать & наиболее удобно, когда образец представляет собой регулярное выражение. Так, команда s/10*/(&)/ находит цепочку, состоящую из единицы, за которой следует любое количество нулей, и заключает ее в круглые скобки. Таким образом, 1 становится (1) 10 становится (10) 100 становится (ЮО) Для начинающих это дополнительное преимущество является еще одним скользким местом. Например, s/Джонс/Джонс & сыновья/ превращает текст Фирма Джонс известна аккуратностью, в текст Фирма Джонс Джонс сыновья известна аккуратностью. (Если вы действительно хотите использовать амперсанд в це- почке замены, то должны поставить перед ним обратную косую черту.) Есть одно утешение: по крайней мере металитеры не дейст- вуют в заменяющей цепочке. В ней вы можете, например, сво- бодно пользоваться точками. Амперсанд и литера, которая отме- чает конец цепочки замены,— это единственные две литеры, которых следует остерегаться. Массовое редактирование Одно из наиболее важных достоинств хранения документов в ЭВМ состоит в том, что вы можете делать систематические за- мены в них. Так, с помощью ЭВМ мы можем легко переимено- вать в нашем романе Грега Деймлера в Кирилла Деймлера, если захотим. Аналогично, мы можем заменить каждое вхож-
152 Часть II. Приложение идей дение числа 1987 на 1988 или каждое словосочетание «в данный момент времени» на «теперь». Систематические изменения часто делаются также и в фай- лах, содержащих тексты программ: программисты постоянно совершенствуют свои программы, изменяя имена переменных, форматы и т. д. Редактор позволяет выполнять массовые замены. Для этого перед командой s надо задать пару адресов, задающих диапазон, в котором должна проводиться замена. Например, команда 1 ,$з/Грег/Кирилл,фр заменяет все вхождения Грег на Кирилл (так как эта замена осуществляется в диапазоне с первой по последнюю строку). Будем надеяться, что в тексте нет слов Грегори, поскольку они превратились бы в Кириллори. Одна из причуд редактора ed состоит в том, что буква р в конце приведенной команды замены вызывает печать только последней строки, в которой была сделана замена, а не каждой такой строки. Буква g, стоящая перед р, имеет важное значение. Она означает, что заменяет- ся каждое слово Грег в каждой строке внутри заданного диа- пазона адресов; если бы мы опустили g, то была бы произведена замена только первого употребления слова Грег в каждой строке текста внутри заданного диапазона адресов. Поэтому строка Она взглянула на Грега. Грег улыбнулся. превратилась бы в строку Она взглянула на Кирилла. Грег улыбнулся. В качестве другого примера систематической замены (в данном случае в ограниченном диапазоне строк) может служить команда .—10,. -HOs/он/она/ заменяющая он на она в десяти строках до и после текущей строки (включая, естественно, и саму текущую строку). Регулярные выражения в команде grep Вы, вероятно, помните, что команда оболочки grep образец файл ... печатает все строки файловое), которые содержат данный об- разец. В предыдущих примерах образец представлялся всегда фиксированной цепочкой. Ранее в этой главе мы упоминали, что в качестве образца может быть любое регулярное выражение,
Гл. 8. Редактирование 153 написанное с использованием металитер, идентичных метали- терам редактора. Примером такого расширенного использования команды grep может служить grep chapterl В данном случае мы имеем дело со сложным образцом, которому соответствует запятая или точка с запятой ([,;]), за которой следует любая цепочка литер (.*), которая завершается запятой или точкой с запятой ([,;]). Таким образом, эта команда выводит на дисплей все строки файла chapterl, что содержат запятую или точку с запятой, за которой далее в этой же строке следует другая запятая или точка с за- пятой, т. е. все строки, которые содержат две или более запятых или точек с запятой (или одну запятую и одну точку с запятой). Такое использование grep объясняет ее курьезное название. Оно означает глобальный поиск регулярных выражений и печать (Globally find Regular Expressions and Print). Включение других файлов Команда г редактора читает файл и помещает его в буфер после заданной строки. Поэтому $r boast добавляет содержимое файла boast в конец буфера (так как $ обозначает последнюю строку). После того как команда г про- читала файл, она печатает количество прочитанных литер и делает текущей строкой последнюю прочитанную строку. Общепринято хранить часто используемые фрагменты тек- стов или программ в отдельных файлах, чтобы их можно было включить в другие создаваемые вами файлы. Так, файл boast может содержать вашу скромную автобиографию, которую вы добавляете в конец каждого написанного вами документа.' Как заглянуть в окружающий мир При работе с редактором можно выполнять любые желаемые команды оболочки, причем это можно делать, не выходя из редактора и не изменяя содержимое буфера. Все, что нужно сделать,— это поставить перед командой оболочки, которую вы намереваетесь выполнить, восклицательный знак. Например,
154 Часть II. Приложение идей г boost ?boost Ils boast boaster boastest ! r boast 7943 В данном случае мы пытаемся прочитать файл boost, но обна- руживаем, что он не существует. (Сообщение «? boost» является одним из наиболее длинных высказываний отшл.) Поэтому мы обращаемся к команде оболочки 1s, чтобы получить листинг своих файлов. Эта команда выводит информацию обычным образом, а затем редактор печатает другой восклицательный знак, чтобы указать, что вы вновь находитесь в редакторе. Теперь вы знаете, что имя вашего файла boast и им можно вос- пользоваться обычным образом. Некоторые версии ed позволяют с помощью конвейера по- давать содержимое буфера на вход команде оболочки. Напри- мер, команда 1,$ | spell посылает весь буфер команде spell. Если этого средства нет и вы хотите использовать буфер в команде оболочки, то сначала следует записать его в файл; например (полагаем, что текущим является файл chapter2): w 1234 Ispell chapter2 Достоинство использования таких команд, как spell внутри редактора, состоит в том, что если необходимо исправить обна- руженные ошибки, то вы можете сразу же приступить к их устранению, так как все еще находитесь в редакторе. Дополнительные возможности редактирования К сожалению, Дотошный Дадли все еще борется со страшной файловой молью, которая поразила его в предыдущей главе. Поэтому он не в состоянии принести нам пользу своим деталь- ным знанием редактора ed. Однако его брат рад услужить. Этот человек — священник, но, к сожалению, он тяжко страдает по причине слабого здоровья. Больное-преподобие Дотошный, как его называют, пишет стандарт на редактор ed; в настоящее время он работает над 14-м томом: Редактирование при помощи более двадцати металитер.
Гл. 8. Редактирование 155 Его комментарии по поводу нашего введения в редактор ed неутешительны. «Ваше описание слишком поверхностно»,— сказал он. «Вы не упомянули о маркировке строк, пересылке блоков текста, шифровке буфера в целях обеспечения секрет- ности, о соединении строк, об использовании g перед командой для расширения действия этой команды на весь буфер, о раз- биении регулярных выражений на отдельные части, задании литер новой строки при заменах, о контекстном поиске в обрат- ном направлении, использовании альтернативы знаку / в ко- манде s.......» Примеры Несмотря на эти ужасные упущения, мы завершим на этом описание редактора ed. Чтобы помочь вам усвоить рассмотрен- ные нами средства редактора, приведем в этом разделе простой пример использования каждого из них. Адреса Адреса определяют строку буфера. 12 двенадцатая строка, $ .-j-3 $—6 /pig/ // текущая строка, последняя строка, третья строка за текущей, седьмая строка от конца буфера, следующая строка, содержащая pig, то же, что и предыдущий образец. Металитеры Металитеры действуют в образцах, задаваемых между косыми чертами. Каждая из приведенных ниже команд про- двигает текущую строку до следующей строки, содержащей указанный образец: /Ах/ х в начале строки, /х$/ х в конце строки, /х.у/ х затем любая литера, затем у, /х.*у/ х затем любая последовательность литер, затем у, /1ху]/ х или у, /[ дху]/ любая литера, отличная от х и у, /\./ точка, /\// /
156 Часть II. Приложение идей Команды (пусто) /pig/ а \ новая строка 1 I новая строка 2 j с 1 замена > J d 1 ,/pig/d i новая строка 1 новая строка 2 1 р 1 ,$р q /Author/г boast г /usr/him/х s/new/fresh/p s/new/fresh/gp s/very //p l,$s/new/fresh/gp s/xx*/(&)/ u w w mycopy .w best line W xxx продвигает текущую строку и печатает ее, продвигает текущую строку на следующую строку, содержащую pig, и печатает ее, добавляет строки вслед за текущей строкой, заменяет текущую строку, исключает текущую строку, исключает строки, начиная со строки 1 и кончая первой строкой, содержащей pig, вставляет новые строки перед текущей, печатает текущую строку, включая невиди- мые литеры, печатает текущую строку, печатает весь буфер, выход из редактора, вставляет файл boast после следующей строки, содержащей Author, вставляет файл usr/him/x после текущей строки, заменяет первое new в текущей строке на fresh и печатает строку, заменяет каждое new в текущей строке на fresh и печатает строку, удаляет первое вхождение слова very (с по- следующим пробелом) в текущей строке и печатает строку, заменяет каждое вхождение слова во всем буфере на слово fresh и печатает (последнюю) измененную строку, заменяет в текущей строке первую последо- вательность букв х на такую же последо- вательность в круглых скобках, отменяет последнюю замену, записывает буфер в текущий файл, записывает буфер в файл mycopy, записывает текущую строку в файл best line, добавляет содержимое буфера к файлу ххх,
Гл. 8. Редактирование 157 .= печатает номер текущей строки, Jis выполняет команду оболочки 1s. Сообщения об ошибках ? нераспознанная команда редактирования, ?? образец не найден, ?ххх какая-либо ошибка, связанная с файлом ххх ?ТМР переполнение внутреннего файла — что-нибудь стало слишком большим. Скользкие места Пропуск точки после вставляемого текста. Использование металитер не по назначению. Экранное редактирование В состав UNIX входит экранный редактор под названием vi. Если ed — это редактор для умных людей, работающих на глу- пых терминалах, то vi — редактор для еще более умных людей, работающих на менее глупых терминалах. Хотя вы, читатель, по определению очень умный человек, мы должны принимать во внимание и других читателей, менее одаренных; поэтому здесь мы не будем вдаваться в подробности о редакторе vi. Может даже случиться так, что ваша система UNIX располагает другим эк- ранным редактором, который может оказаться более подходящим для начинающих, чем редактор vi, и поэтому нет непосредствен- ной необходимости изучать vi. Все, что мы здесь сделаем, это упо- мянем некоторые принципы работы экранных редакторов. Экранные редакторы работают с буфером точно так же, как и ed. В отличие от редактора ed буфер всегда выводится на экран дисплея. Типовой дисплей позволяет вывести на экран 24 строки текста, и мы будем полагать, что экранный редактор отводит 22 строки экрана на вывод буфера. Оставшиеся две строки ис- пользуются для показа текущего состояния редактирования, и иногда — для отображения литер, вводимых с клавиатуры. Оче- видно, буфер обычно длиннее 22 строк; экран можно рассматривать как 22-строчное «окно», через которое можно видеть любую часть буфера. Экранный редактор имеет команды, которые дают поль- зователю возможность перемещать окно в любую желаемую часть буфера. Чтобы указать местонахождение литеры в пределах окна, пользователь перемещает курсор влево или вправо, вверх или вниз, пока он не достигнет желаемой точки. Таким образом, вме- сто понятия текущей строки мы имеем понятие текущей литеры. (Некоторые экранные редакторы используют дополнительные по- нятия текущего слова и текущей строки, но мы не будем здесь
158 Часть II. Приложение идей этого касаться.) Все операции редактирования выполняются в позиции текущей литеры. Так, вы можете исключить текущую литеру или вставить перед ней другую литеру. Большое достоин- ство экранного редактора состоит в том, что вы видите, что вы делаете: при каждом изменении экранный редактор корректи- рует изображенные в окне, так что вы можете посмотреть на ре- зультат внесенного изменения. Чтобы показать разницу между экранным и построчным ре- дактированием, рассмотрим команду ed s/он/Серж/р При работе с экранным редактором вам не нужен образец, чтобы найти слово он. Вы просто устанавливаете на него курсор — возможно, вначале вам понадобится переместить окно. Затем вы дважды вводите команду удалить (одиночная клавиша почти во всех экранных редакторах), чтобы удалить о и н. По мере того как вы делаете удаления, на экране происходят изменения. Что- бы закончить редактирование, вы вводите команду вставки, и за ней — текст Серж. Наконец, вы вводите признак конца для ука- зания конца вставки. Некоторые реализации ed обладают ограниченной формой экранного редактирования. В них вы можете перемещать курсор вдоль текущей строки и изменять литеры, на которые он указы- вает.
ГЛАВА 9 ДОКУМЕНТАЦИЯ И СВЯЗЬ Биографы поражены лишь одной его чертой,— Что он при всей своей славе вздыхал все время о той, Которая содержала в идеальном порядке дом, Свистела, блуждая по саду в сумерках скоротечных И отвечала на некоторые из его бесконечных Длинных писем, которых никто не видел потом. Оден (Перевод П. Глушко) В этой главе мы расскажем, как получать сведения о своей вер- сии UNIX и как связаться с другими пользователями. Идеальная операционная система имеет интерактивную ин- формационную службу. Всякий раз, когда перед вами встает воп- рос, такой как:
160 Часть II. Приложение идей • как работает команда? • какие команды обрабатывают каталоги? • почему данная строка не делает то, что я хочу? вы просто набираете этот вопрос на своем терминале и операцион- ная система немедленно дает вам полезный и дружеский ответ. Эта идеальная информационная служба даже лучше, чем живой консультант, находящийся рядом с вами, так как она не будет смеяться над вашим невежеством и глупостью. Операционные системы самого низкого класса не обладают информационной службой. Взамен вам необходимо купить печат- ное руководство и выискивать там всякий раз нужную инфор- мацию. Ни одна из операционных систем, существующих на сегод- няшний день, даже близко не подходит к нашему идеалу. Зато есть масса систем, близких к нижайшему уровню,— некоторые даже кажутся еще хуже, чем только можно себе представить: печатные руководства составляют несколько толстых томов; каждый том состоит из пачки подшитых листов, причем страни- цы постоянно изменяются, а некоторые страницы несут на себе следы карандашных поправок. Разные реализации системы UNIX занимают разные места в диапазоне от идеальных систем до систем самого низкого класса. Большинство все же находится на пути к идеалу, поскольку документация находится в самой машине и ее можно получить с терминала. Документация UNIX Авторитетным описанием UNIX является Руководство для про- граммиста системы UNIX. Существует несколько различных вер- сий этого руководства в зависимости от даты выпуска, машины и местных особенностей. Руководство для программиста системы UNIX делится (обычно) на два тома. Наиболее важным является том 1, который дает достаточно полное описание системы. Он написан макси- мально сжато, хотя является все же большой работой, и рассчи- тан на умеренно искушенного читателя. Том 1 дополняется томом 2, который по объему даже превос- ходит первый том и может быть разделен на несколько подтомов. Том 2 не имеет четкой структуры и содержит большое количест- во статей по различным вопросам UNIX. Некоторые из этих ста- тей носят учебный характер и хороши для начинающих; другие рассчитаны на специалистов и касаются вопросов администриро- вания или деталей реализации; некоторые содержат подробней- шее описание специализированных программ системы UNIX,
Гл. 9. Документация и связь 161 таких как компиляторы и системы подготовки текстов; некоторые описывают особенности местной версии системы UNIX. Боль- шинство статей носит самостоятельный характер и не зависит от других. Некоторый учебный материал, а также замечательные техни- ческие работы можно найти в специальном выпуске журнала The Bell System Technical Journal, посвященном системе UNIX (т. 57, № 6, ч. 2, июль — август 1978 г.). В типичной реализации UNIX том 1 хранится в самом ком- пьютере и доступен в интерактивном режиме. Мы допустим в этой главе, что ваша UNIX относится к одной из таких систем. Пре- имущества хранения документации в самом компьютере весьма велики: • документацию можно получить с любого терминала; • это дешевле, чем печать большого числа руководств; • документация может быть быстро обновлена; • ее можно обрабатывать средствами программного обеспече- ния, например средствами для поиска по заданным словам, средствами для вывода на дисплей ее различных частей, сред- ствами редактирования и т. д. Единственный подлинный недостаток — это то, что обширное количество интерактивной документации требует много файловой памяти, что может повлечь необходимость некоторых сокращений в случае небольших систем. Документация UNIX, такая как том 1 Руководства для про- граммиста системы UNIX, обычно хранится в машине в закоди- рованном виде (конкретно — во входном формате для системы nroff/troff, которая будет описана ниже). Когда пользователь запрашивает вывод части документации на свой терминал, зако- дированная форма преобразуется в печатную. Недостаток такой организации в том, что вывод на дисплей может быть замедлен- ным, зато существует огромное преимущество: форма изображе- ния может быть приспособлена к типу терминала (например, ши- рина строк, использование жирного шрифта и т. д.). Можно от- метить второе преимущество: закодированная форма занимает меньше файлового пространства, чем форма печатная. Если вы собираетесь пользоваться Руководством для програм- миста системы. UNIX, то вам полезно узнать немного о его ор- ганизации. Том 1 делится на восемь разделов. Раздел 1 наиболее важен, он содержит описания всех команд системы. Сама оболочка, которая соответствует команде sh, описана в данном разделе, хотя это описание предназначено, без- условно, не для новичков. Внутри раздела 1 введена подкласси- 6 № 1 6 1
162 Часть II. Приложение идей фикация для команд, которая обычно организуется следующим образом: 1С команды для связи с другими системами; 1G команды графики; 1М команды для сопровождения системы (см. ниже также раздел 8); 1 команды общего пользования. Разделы 2 и 3 интересны для программистов, особенно для тех, кто пишет программы на языке С. Эти разделы описывают библиотеки и способы использования непосредственно из прог- рамм некоторых возможностей, встроенных в UNIX. В разделе 4 приводится информация об управлении устройства- ми ввода-вывода. Раздел 5, также предназначенный для программистов, содер- жит информацию о файлах, встроенных в систему или создавае- мых системой. Раздел 6 — это следующий, после раздела 1, раздел, который, вероятно, заинтересует новичков. Он содержит описания имею- щихся в наличии игровых программ. Раздел 7 содержит разнообразную полезную информацию, такую как определение кода ASCII, и некоторый материал, по- лезный при подготовке документации. Раздел 8 необходим для тех, кто обслуживает системы UNIX. Некоторые вариации тома 1 местного характера содержат и другие разделы в добавление к этим восьми. Каждый раздел состоит из некоторого числа «справочных страниц», по одной странице на каждую тему. В разделе 1, на- пример, отводится по одной странице на каждую команду. Неко- торые из таких справочных «страниц» на самом деле занимают несколько реальных страниц. В частности, страница о sh, обо- лочке, занимает полдюжины или около этого реальных страниц. Страницы в разделе располагаются в алфавитном порядке. Для ссылки на страницы принято использовать следующие имена: ls(l) graph(lG) chess(6) Число в скобках указывает номер раздела, в котором можно наити справочную страницу о данной команде. Так, описание chess, программы игры в шахматы, находится среди описаний игр в разделе 6.
Гл. 9. Документация и связь 163 Извлечение информации из руководства Мы предположим, что том 1 Руководства для программиста сис- темы UNIX доступен в вашей реализации в интерактивном ре- жиме. Для доступа к нему используется команда man. Напри- мер, команда man Is выдаст вам справочную страницу для команды 1s. Аргументом команды man должно быть имя справочной страницы; обычно аргументом является имя команды, о которой вы хотели бы по- лучить справку. В общем случае команда man осуществляет просмотр каж- дого раздела руководства и распечатывает все страницы с дан- ным именем, которые она находит. (Может так случиться, что в 3-м разделе руководства, так же как и в разделе 1, есть файл с именем Is, и если это так, то вы об этом будете информированы.) Можно ограничить поиск, указав необходимый вам раздел, на- пример: man 6 chess Это может ускорить поиск, особенно для имен вне раздела 1, который просматривается первым. Переадресация вывода Поскольку команда man — обычная команда UNIX, ее вывод может быть переадресован или направлен по конвейеру, напри- мер, man Is >myfile man chess | Ipr man Is grep group В первом примере вывод команды man помещается в myfile. (Обычно это не очень хорошо, так как если каждый пользователь будет хранить свою собственную копию документации, то в ско- ром времени все файловое пространство будет исчерпано.) Во- втором примере справочная страница по chess передается по конвейеру команде 1рг, так что печатается твердая копия. Третий пример снова использует конвейер на этот раз для поиска всех строк в справочной странице о команде 1s, содержащих цепочку «group». €»
164 Часть II. Приложение идей Формат справочных страниц Чтобы облегчить пользователям поиск информации, справоч- ные страницы имеют стандартный формат. Каждая страница начинается с заголовка NAME (ИМЯ), за которым следует имя команды (или что-то еще), описанной в данной странице. За именем команды в той же строке находится однострочное описание. Например, $ man Is NAME Is list contents of directory (Is выводит содержимое каталога). Затем на странице следуют 5 других подразделов с заголовками SYNOPSIS DESCRIPTION FILES SEE ALSO BUGS Для некоторых страниц один или несколько из указанных заго- ловков могут быть опущены. Подраздел SYNOPSIS (РЕЗЮМЕ) дает синтаксическое опи- сание команды, в подразделе DESCRIPTION (ОПИСАНИЕ) содержится словесное определение — обычно это самая длинная часть справочной страницы. Подраздел FILES (ФАЙЛЫ) описы- вает все файлы, используемые командой (обычно встроенные фай- лы системы UNIX). Так, программа spell может использовать системный файл со странным именем, таким как /usr/dict/hlistb, содержащий ее словарь. Подраздел SEE ALSO (СМ. ТАКЖЕ) охватывает родственные команды, а в подразделе BUGS (НЕДО- СТАТКИ) перечисляются нерешенные проблемы. «Недостатки! являются скорее описанием особых случаев («Если вы совершите это необычное действие, то результатом будет ...»), чем катастрофи- ческих ситуаций, которые требуют немедленного вмешательства. Мы надеемся, наступит день, когда вы будете создавать свои собственные команды, которые окажутся настолько полезными, что станут составной частью используемой вами системы UNIX. Если это произойдет, команды следует должным образом доку- ментировать, иначе они будут бесполезны; очевидно, имеет смысл чтобы ваша собственная документация следовала общим согла- шениям системы UNIX. Таким образом, когда-нибудь вы сможе- те сами написать справочную страницу системы UNIX.
Гл. 9. Документация и связь 165 Другие виды помощи Система man полезна только в том случае, если вам известно имя команды, которая выполняет необходимую вам работу. Если это имя вам неизвестно, то попытки угадать его не всегда увенчаются успехом. Сколько потребуется времени, чтобы угадать, что име- нем команды, которая ищет заданную цепочку литер, является grep? Для решения этой проблемы некоторые реализации UNIX имеют команду help (помощь) (иногда называемую apropos), которая пытается идентифицировать имя команды для выполне- ния данной работы. Обычно система help работает следующим образом. Человек, который обслуживает вашу систему UNIX, созда- ет файл, содержащий однострочные описания всех имеющихся команд. (Для создания этого файла могут быть использованы строки справочных страниц, следующие за заголовком NAME (ИМЯ).) Когда пользователю необходима помощь, он просто набирает help цепочка и help ищет эту цепочку в данном файле, печатая все найденные строки, например, $ help scan awk(l): pattern scanning and processing language. scanf(3s): formatted input conversion. Если пользователь действительно искал команду grep, он не обнаружил то, что хотел, но по крайней мере команда help от- крыла ему существование языка поиска и обработки по образцам awk, который может оказаться полезным для изучения. (Под- программа scanf преобразования входного потока по формату, описанная в разделе 3, интересна только для специалистов.) Если пользователь подберет синоним для слова scan (просмотр), например search (поиск) $ help search grep(l): search a file for a pattern. то обнаружит команду grep. Он может затем использовать коман- ду man grep чтобы получить полную информацию. Пользователь может также попробовать другое слово в по- исках grep, например file (файл): help file
166 Часть II. Приложение идей В этом случае он получит в ответ длинный список, поскольку большинство команд UNIX работают с файлами, но grep, без- условно, попадет в этот список. Вспомогательные системы помощи Некоторые команды UNIX, такие как ed, у которых есть свои собственные подкоманды, могут иметь и свои собственные систе- мы помощи. Чтобы обратиться к такой системе, часто достаточно ввести h или знак вопроса. В частности, некоторые версии ed имеют команду h, которая выдает список всех имеющихся команд редактирования. Критические замечания Команды man и help, если они у вас есть, безусловно, ценны, но это все же не идеальная информационная служба. В частности, • они не дают конкретную помощь при возникновении специ- фических вопросов типа: «Что же такое я здесь сделал?» • существует разрыв между командой help, которая обеспечи- вает однострочную информацию по каждой теме, и командой man, которая часто дает слишком детализированную и под- робную информацию в используемой нами системе, этот раз- рыв ликвидируется командой how, которая дополняет вывод команды help списком всех имеющихся у данной команды опций; она дает однострочное описание каждой опции плюс, где необходимо, некоторую другую существенную информа- цию. Данная команда, либо ее эквивалент, становится сей- час все более распространенной. Те из нас, кто разрабатывает и реализует программное обеспе- чение, которым будут пользоваться другие, только сейчас на- чинают понимать, что нельзя создавать новые средства, не обес- печивая рядовых пользователей системами помощи при работе с ними. Необходимо сочетать огромные исследования и разработ- ки, постоянно ведущиеся для создания более развитых средств с такими же усилиями, затрачиваемыми на решение еще более страшной задачи — обеспечения интерактивного справочного руководства, когда эти развитые средства разбушуются в руках неискушенного пользователя. Все более широкая доступность высококачественных гра- фических терминалов облегчает создание таких руководств. Од- ним из средств помощи, широко используемым в настоящее вре-
Гл. 9. Документация и связь 167 мя в программном обеспечении, написанном для таких термина- лов, является вспомогательное меню. Когда пользователь нахо- дится в затруднении, он нажимает специальную клавишу HELP на терминале, и в некоторой части экрана появляется меню: это меню объясняет, какие команды могут быть введены в теку- щем состоянии. Например, пользователю, который поскользнул- ся в редакторе ed, забыв поставить точку, меню подскажет, что точка возвратит его в командный режим. Понадобится некоторое время, чтобы такого рода средства помощи стали доступны повсеместно. Пока же вы должны быть довольны тем, что системы man и help, предоставляемые UNIX, хотя и несовершенны, но все же намного лучше, чем то, что пре- доставляют другие операционные системы. Автоматизированная система обучения В некоторых реализациях UNIX имеются обучающие програм- мы, которые могут помочь вам изучить определенные аспекты системы. Эти программы обычно предоставляют вам описание того, как выполнять некоторые действия, например как редак- тировать файл, а затем просят вас выполнить простое упражнение, чтобы проверить, усвоили ли вы материал. Мнения о пользе такого рода программ различны, но если вам интересно попробовать, то можете найти в своей системе команду с именем learn. Почта На этом мы закончили обсуждение пассивной стороны связи: извлечение информации из UNIX. В оставшейся части этой гла- вы мы обсудим активную связь: обмен сообщениями с другими людьми посредством электронной почты. Электронная почта используется как локально для связи между пользователями, работающими на одной ЭВМ, так и гло- бально для связи между пользователями на различных ЭВМ, сое- диненных между собой сетью. Сети ЭВМ быстро растут; они варь- ируются от сетей, охватывающих компьютеры в одном здании, до международных вычислительных сетей. Такие сети все больше используются для обмена информацией как фирмами, так и от- дельными лицами. Мы сконцентрируем внимание на локальной почте. Если ваш компьютер подсоединен к какой-либо сети, которая поддерживает глобальную почту, то скорее всего глобальные возможности бу- дут расширенным вариантом локальных.
ткущих пользователей Перед тем как послать почту, часто полезно узнать, кто в данный момент работает на вашей ЭВМ. Для этого вы просто набираете команду who UNIX ответит чем-нибудь вроде ЫН ttyOl Jul ' 1 12:45 арег tty03 Jul 1 1 13:16 те ttyll Jul ’ I 13:50 аппе tty 13 Jul 1 13:20 dudley tty 15 Jul ! 1 04:20 Первый столбец — это список входных имен всех пользователей, вошедших в систему в данный момент. Вы сами должны находить- ся где-нибудь в этом списке. Против каждого входного имени находится идентификатор терминала, на котором работает дан- ный пользователь, а также дата и время его входа в систему. Терминалы обычно идентифицируются сокращением tty (проис- ходит от слова «Teletype»), за которым следует произвольный но- мер. Если все терминалы, подключенные к вашей системе UNIX, находятся в одной комнате, то команда who может показаться вам бесполезной. Легче узнать, кто находится в системе, просто посмотрев вокруг. Однако в действительности это не так. Некото- рые пользователи имеют несколько возможных входных имен, а команда who сообщит вам, которое из них они используют в дан- ный момент. В кризисной ситуации вы можете воспользоваться расширен- ной формой команды who: who am I («Кто я?») В данном случае UNIX одним махом решает один из глубочай- ших философских вопросов, отвечая me ttyll Jul 1 13:50 Вывод команды who, как и любой другой команды UNIX, может быть направлен в конвейер. Так, who | grep bill -найдет все вхождения слова bill в выводе команды who. Так, если bill не работает сейчас в системе, никакого ответа не будет (если только нет другого пользователя с именем spoonbill пли в этом роде); если bill работает в системе, то ответом будет соответствую- щая строка вывода команды who.
Гл. 9. Документация и связь Любопытным Если вы по природе любопытны, UNIX обеспечит вас ря, средств для удовлетворения вашего любопытства. Некоторые р лизации UNIX позволяют наводить справки о личных дел конкретного пользователя. Команды для осуществления этс различны, но одна из возможных форм finger anne Имя finger (дотронуться) подразумевает тесную личную свяь между пользователями, но все, что вам сообщают — это полис имя anne (Анна), время, когда она вошла последний раз в систь му, и, возможно, ее положение и координаты рабочего места в ор ганизации, которая владеет используемой вами системой UNIX Кроме возможности узнать, кто есть кто, имеется возможность узнать, кто что делает. Для этого надо ввести команду ps —а Эта команда выдаст информацию о всех процессах, выполняемых в настоящий момент. Для каждого процесса команда сообщит, в частности, терминал, который этим процессом управляет, а зная терминал, вы можете установить пользователя. (В некоторых вер- сиях можно вводить —аи вместо —а и получать входные имена пользователей для каждого терминала, так что нет необходимос- ти подвергать испытанию свои дедуктивные способности.) Общение Существуют две команды для посылки сообщений другим поль- зователям: write (писать) и mail (почта). Первая из них — это грубая форма прерывания работы адресата и вывода ему вашего сообщения. Вторая является более культурной формой связи. Мы начнем с грубой формы общения, а затем будем перевоспи- тываться. Так как команда write относится к немедленной форме свя- зи, то вы можете писать только тому, кто работает в системе в данный момент. Поэтому перед командой write часто исполь- зуется команда who. Аргументом команды write является вход- ное имя пользователя, которому вы хотите адресовать сообщение. Если мы введем команду write anne то результат, который мы увидим, не драматичен. Кажется, что наш терминал как бы замирает. Причина этого состоит в том, что система ожидает еще ввода, а именно нашего сообпюч— точно так же, как она ожидает -
170 Часть II. Приложение идей События происходят на терминале Анны (аппе). Ее работа пре- рывается сообщением Сообщение от пользователя me tty 11 ... С этого момента каждая вводимая нами строка выводится на тер- минал Анны. Это продолжается до тех пор, пока мы не закончим ввод, набрав Ad. Так, мы могли бы использовать команду write следующим образом: $ write аппе Простите, что я вас прерываю, но я только что изучил команду write. Ad $ Используя write, можно вести двусторонний разговор. Когда Анна (аппе) обнаружит, что ей пишем мы (те), она может решить написать нам (те) и введет команду write me После того как она это сделает, не только строки, вводимые нами, будут воспроизводиться на ее терминале, но и на нашем терминале будут воспроизводиться строки, вводимые ею. Это превосходный рецепт для беспорядочной беседы, поэтому неко- торые пользователи UNIX разработали неформальные правила для информирования своих собеседников о том, когда желатель- но начать ввод ответных сообщений. Общим правилом является, что (О) означающее «over» (прием), служит сигналом для другой стороны продолжать переписку; с использованием этого соглашения диа- лог с Анной (аппе) мог бы развиваться следующим образом: $ write аппе У меня появилась новая игра (в системе UNIX), в которую я хотел бы с тобой поиграть. Ты свободна сегодня вечером? (О) Сообщение от аппе tty 13... НЕТ (О) Ты свободна завтра вечером? (О) НЕТ EOF Тогда я зайду прямо сейчас. Ad $
Гл. 9. Документация и связь 171 Когда аппе получила наше сообщение, оканчивающееся на (О), она решила написать нам. Поэтому мы получили строку Сообщение от аппе tty 13 ... за которой последовало ее короткое сообщение. Затем мы спро- сили, свободна ли она завтра вечером, и она, сказав нет, вероят- но, нечаянно набрала Ad, закончив таким образом свою команду write. Получатель всегда получает строку, содержащую слово EOF (означающую End-Of-Fille, т. е. конец файла) по концу команды write. Неотпугнутые ее ошибкой, мы вводим последнюю строку нашего сообщения и затем Ad для окончания диалога с на- шей стороны. Для аппе разговор выглядит на дисплее следующим образом. Сообщение от me tty 11... У меня появилась новая игра (в системе UNIX), в которую я хотел бы с тобой поиграть. Ты свободна сегодня вечером? (О) $ write me НЕТ (О) Ты свободна завтра вечером? (О) НЕТ Ad $ Тогда я зайду прямо сейчас. EOF Посылка почты Более культурная форма связи использует команду mail (поч- та), а не команду write. Почтовые системы различны в разных реализациях, но обычно имеют следующие свойства: • адресатам нет необходимости находиться в системе во время посылки сообщения; • почта автоматически хранится, возможно, несколько недель, пока адресат не войдет в систему и не просмотрит ее; • одно и то же сообщение, по желанию, может быть послано бо- лее чем одному адресату (в некоторых реализациях некото- рые или даже все адресаты могут находиться на других ЭВМ, связанных с ЭВМ отправителя сетью); • существует механизм для сохранения получаемых вами сооб- щений. Посылка сообщения при помощи команды mail почти иден- тична использованию команды write. Основная разница состоит в том, что сообщение можно закончить строкой, состоящей из одной точки, вместо Ad- Например,
172 Часть II. Приложение идей $ mall аппе Ты не получила сообщение о том, что я иду, так как когда я пришел, ты уже ушла. Пожалуйста, напиши мне как можно скорее. Если вы хотите послать одно и то же сообщение нескольким лицам, вы указываете входные имена всех их в качестве аргу- ментов команды mail, например, mail anne yvonne тагу Вы можете, если желаете, послать почту самому себе, на- пример, mail me Этим можно пользоваться для того, чтобы напомнить себе, что следует сделать, при следующем входе в систему. В системах, в которых разрешается посылать почту удален- ным пользователям на других машинах, имя получателя часто записывается в виде xmachinelhim где xmachine идентифицирует ЭВМ, a him пользователя. Однако соглашения сильно отличаются, поэтому вам необходимо обра- титься к документации по своей системе. Если вам надо послать кому-то длинное сообщение, вы може- те подготовить его в некотором файле и заставить команду mail брать входные данные из этого файла, например, mail anne <message Обычно так делать лучше. Когда мы заметили ошибку в слове «получила» в нашем последнем сообщении для Анны, эта строка уже была отправлена и ничего поделать было нельзя. Получение почты Когда вы входите в UNIX, вы получаете сообщение, если для вас имеется какая-нибудь почта (например, «Для вас есть почта»), В некоторых реализациях вы уведомляетесь также о появлении новой почты во время работы в системе (например, «Для вас есть свежая почта»), В любом случае, если вы хотите просмотреть свою почту, вы просто набираете mail В общем случае вас может дожидаться несколько почтовых от- правителей. Они хранятся в вашем «почтовом ящике», который является файлом, находящимся где-то в файловой системе UNIX
Гл. 9. Документация и связь 173 (часто в каталоге usr/spool/mail). Когда вы выдаете команду mail, печатается первое послание из вашего почтового ящика, а затем выводится вопросительный знак, запрашивающий, что де- лать дальше. Существует несколько возможных действий, из ко- торых наиболее популярны следующие: • нажатие клавиши возврата каретки переводит вас к следую- щему сообщению, если таковое имеется; • нажатие клавиши d удаляет текущее сообщение и затем осу- ществляет переход к следующему сообщению; • набор s имя-файла сохраняет последнее сообщение в файле с данным именем и осу- ществляет переход к следующему сообщению (либо в некото- рых реализациях осуществляет выход из почтовой системы). Если вы опустите имя файла, сообщение будет сохранено в фай- ле с именем mbox, подразумеваемым по умолчанию. Многие поль- зователи, проработав с операционной системой UNIX некоторое время, постепенно создают файл mbox, содержащий ценные сооб- щения сохраненными. Обратите внимание, что этот файл mbox является вашим собственным файлом, контролируется вами и от- личен от почтового ящика, в котором накапливаются приходя- щие к вам сообщения. Сохраняемые сообщения добавляются в конец файлов, так что предыдущее содержимое остается нетрону- тым; • при нажатии клавиши q осуществляется выход из почтовой системы и возврат в оболочку; • при вводе вопросительного знака выдается краткая сводка команд, имеющихся в распоряжении почтовой системы. Отметим, что во многих версиях почтовых систем UNIX, если вы только читаете сообщения и не сохраняете или не удаляете их, они остаются в вашем почтовом ящике и снова выводятся на дисплей, когда вы в следующий раз набираете команду mail. Это все равно, что сказать почтальону: «Это письмо очень интерес- ное. Принесите его со следующей почтой, и я еще раз посмотрю его.» В качестве примера получения почты мы предположим, что, когда Анна в следующий раз войдет в систему, ее будут ожидать два сообщения, одно от Дадли, а другое от нас. Она делает следую- щее: $ mail От dudley втор июл 1 13:00:59 Я вас люблю. Встретимся вечером как обычно, после того как я закончу сеанс работы с UNIX.
174 Часть II, Приложение идей ? s teasure От те втор июл 1 12:10:21 Ты не получила сообщение о том, что я иду, так как когда я пришел, ты уже ушла. Пожалуйста, напиши мне как можно скорее. ? d ? q $ mail dudley В данном случае mail выводит первое сообщение и выдает под- сказку вопросительный знак. Отметим, что все почтовые сооб- щения начинаются с имени отправителя и почтового штемпеля, в котором указан день и время отправки (с точностью до секун- ды). Поэтому не пытайтесь использовать почту UNIX для от- правления анонимок суперпользователю. Анна сохраняет сообщение от Дадли в файле с именем treasu- re (сокровище), а затем почтовая система выводит следующее сообщение, которое является нашим. К несчастью, Анна ошибоч- но нажимает клавишу d и уничтожает это сообщение. Расстроен- ная своей ошибкой, она выходит из почтовой системы. Затем она готовится послать письмо Дадли в ответ на его нелепое сообще- ние. Управление почтой Ненужная почта является проблемой в обычных почтовых систе- мах. С наличием электронной почты эта проблема стала еще серьезнее, потому что почту очень легко посылать. К сожалению, невозможно автоматически отфильтровать ненужную почту, но UNIX все же предлагает некоторые средства по управлению командами mail и write. В частности, вы можете полностью за- претить связь посредством write, набрав mesg п После этого никто не сможет прервать вас письмом, пока вы не наберете mesg у для разрешения писать снова. В особенности важно поставить запрет на письма, если ваш терминал — печатающий и исполь- зуется для подготовки документации. В действительности неко- торые программы UNIX для подготовки документации автома- тически запрещают письма, поэтому бессодержательное сообще- ние от вашего друга не появится в середине конечной копии ва- шего бестселлера.
Гл. 9. Документация и связь 175 Хотя вы можете управлять командой write, вы не можете управлять командой mail, если только ваша система не расши- рена специальными средствами для этого. Если такие средства имеются, вы можете проанализировать список людей, которые прислали вам почту, и затем удалить сообщения от всем известных зануд. Если вы хотите автоматизировать получение почты при входе в систему, то можете поместить соответствующие команды в свой входной командный файл. И вновь детали сильно зави- сят от конкретной реализации вашей почтовой системы. Доступ к удаленным машинам Использование вычислительных сетей находится еще в стадии младенчества, и многие системы имеют свои собственные спе- циальные процедуры и соглашения для связи. Вообще говоря, пользователям, выполняющим программы на одной машине, не- возможно получить доступ к файлам на другой Вместо этого при- ходится делать явную копию файла для машины, на которой предполагается его использовать. Чтобы облегчить эту проце- дуру, некоторые реализации UNIX снабжены версией команды ср с именем uucp, что означает копирование UNIX —UNIX. Предполагается, что обе машины, отправитель и получатель, ра- ботают под управлением UNIX. Для использования uucp наби- рается строка вида uucp файл эвм\новый-файл в результате чего ваш файл копируется в новый-файл на заданной ЭВМ. Если есть разрешение, то вы можете воспользоваться так- же командой uucp для копирования файлов с других машин на свою. Однако не ожидайте слишком многого от команды uucp. Ор- ганизация свободной передачи файлов между машинами встре- чает серьезные трудности с точки зрения защиты, поэтому может оказаться, что возможности команды uucp для вас ограничены несколькими каталогами. Резюме о средствах общения Подведем краткий итог тому, о чем было сказано в этой главе: • используйте команды help и man, чтобы узнать, как работать с системой UNIX; • используйте команды who и ps, чтобы узнать, что происходит на машине; • используйте команду mail и, возможно, при случае команду write для связи со своими приятелями; • если ЭВМ является частью сети, то, возможно, что вы смо- жете использовать команды mail и uucp для связи с абонента- ми на других ЭВМ.
ГЛАВА 10 ОШИБКИ Человеку свойственно ошибаться Богу — прощать Дать подходящее сообщение об ошибке — верх справедливости. Старая пословица В этой главе мы попытаемся дать несколько полезных советов о том, что надо делать, когда дела идут плохо. К сожалению, чис- ло возможных ошибок и недоразумений при использовании UNIX, как и любой другой операционной системы, так велико, что мы можем только коснуться их поверхностно. Работает или простаивает Говорят, что вычислительная система работает, если она нор- мально функционирует, и простаивает в противном случае. Внезапный переход от первого состояния ко второму называется аварией. Если ваша система UNIX простаивает, то это из-за ап- паратных или программных сбоев или связано с расписанием обслуживания. Во многих случаях вас не интересуют причина эд hwejoh xdaaa аинажейзпси
Гл. 10. Ошибки Г/ поломки — этим должен заниматься кто-нибудь другой. Все, чп вы хотите знать,— это когда система снова заработает. Если вь с этим согласны, то пощадите чуточку беднягу, которому прихо дится обслуживать вашу систему; помните, что чем больше вы его отрываете вопросами о том, когда он закончит, тем дольше это будет продолжаться. К счастью, аварии с большинством систем UNIX случаются редко. Если они все же происходят, то с ними связаны два об- щих явления. Одно состоит в том, что каждый пользователь ду- мает, что это он вызвал аварию. («Я набрал команду 1s и система встала.») Помните, что внутри ЭВМ обычно выполняется несколь- ко процессов — даже в том случае, когда вы работаете один,— и поэтому маловероятно, чтобы то, что вы набрали на терминале, прямо вызвало поломку. Второе явление состоит в том, что аварии происходят всегда в самое нежелательное время — за полчаса до ответственного мо- мента или после того, как вы только что ввели 1000 строк текста ъ буфер редактора, wj еще не успели сохранить мх в файле. Опыт- ные пользователи решают первую из этих проблем, перенося сроки на день раньше положенного, и выдерживают их. Пробле- ма потери буфера иногда, к счастью, решается самой системой UNIX. Если авария происходит при работе в редакторе ed, то система пытается сохранить буфер редактора в файле с именем ed.hup (hup происходит от слова hiccup — икота п). Поэтому, прежде чем прыгать с небоскреба из-за того, что вы потеряли все при аварии в момент редактирования, вновь войдите в систему, когда она заработает, и посмотрите, нет ли у вас файла ed.hup. Начальные проблемы Если вы садитесь за терминал и не можете привести его в чувст- во, то не всегда легко определить: простаивает ли система UNIX или что-то случилось с терминалом. Лучше всего посмотреть на других пользователей, если они есть поблизости: не улыбаются ли они? Если улыбаются, то скорее всего не работает терминал или, что еще более вероятно, система не признает его. В этом слу- чае обычно нужна помощь специалиста, хотя вы и сами можете поэкспериментировать, изменяя скорость линии связи пли нажи- мая такие клавиши, как FULL-DUPLEX (полный дуплекс) или BREAK (останов). Если вам удалось связаться с UNIX, но все ваши попытки войти в систему неизменно отвергаются, то необходима помощь суперпользователя. Либо она (суперпользователь) не считает 11 Это шутка. На самом деле это сокращение от hang ио — пяяпг. связи.— Прим. ред.
178 Часть II. Приложение идей вас за правомочного пользователя, либо неверен ваш пароль — возможно, по той причине, что ваш милый друг поменял его. Если вам удалось войти в систему, то начинаются настоящие проблемы, поскольку теперь обычно только один человек может помочь вам — вы сами. Зависание терминалов Общей проблемой является ситуация, когда терминал попадает как бы в замороженное состояние. Это называется зависанием терминала. Существуют три возможные причины зависания: (1) простаивает система; (2) вы выполняете команду, которая требует много времени; возможно, также, что ваша программа зациклилась; (3) система ожидает, когда вы наберете что-либо. Из указанных случаев (3) несомненно наиболее распространен- ный. Начинающие часто забывают нажать клавишу возврата ка- ретки в конце строки, и в результате оказывается, что они ожида- ют каких-то действий от системы, а система в свою очередь ждет, когда они закончат ввод строки. Другая возможность связана с тем, что зависание терминала может быть вызвано прокрут- кой: не исключено, что система ждет, когда вы введете литеру, разрешающую вывод очередной порции данных размером в эк- ран, или, возможно, вы намеренно или нет набрали As и тем са- мым заморозили изображение на экране — и, следовательно, те- перь вам необходимо набрать Aq, чтобы его разморозить. Третья возможность состоит в том, что вам следовало ввести Ad в конце некоторых данных, а вы забыли это сделать. В этом случае вы будете думать, что ввод данных окончен и система приступила к их обработке, но на самом деле это не так. Четвертая возмож- ность возникает, когда система выдает вам приглашение для от- вета на некоторый вопрос и ожидает ответа. Такие приглашения, однако, обычно очевидны (кроме приглашений отшл в редакторе ed и нм подобных): даже в том случае, если подсказкой является знак вопроса, должно быть ясно, что от вас требуется что-то на- брать. Учитывая эти четыре возможности, что вам нужно сделать с замороженным терминалом — это что-нибудь набрать. Хорошо начать с возврата каретки. Отличными кандидатами являются также Ad и Aq. Если это не помогает, то налицо может быть случай (1) или (2). Если литеры, которые вы набираете, отображаются на экра- не, то скорее всего система не стоит, а выполняет длительную команду. В этом случае, если вы хотите завершить свой затянув- шийся процесс, это обычно достигается клавишей останова.
Гл. 10. Ошибки 179 Ненасытный аппетит Альтернативой замороженному терминалу является терминал с ненасытным аппетитом: каждая вводимая вами строка прогла- тывается им без всякого ответа. Это почти всегда вызвано про- пуском признака завершения данных. Поэтому попробуйте на- брать /\ d или, если вы работаете в редакторе ed, точку. Если все это не помогает, нажмите клавишу останова. Программа, из которой нельзя выйти Общий недостаток, которым страдают плохие обучающие про- граммы, состоит в следующем. Неискушенный пользователь входит, набирая соответствую- щую команду UNIX, в такую программу и некоторое время за- бавляется с ней. Затем ему это надоедает, и он решает выйти. Программа вывела на дисплей вопрос: Как называется столица Бразилии? Пользователь пробует q, Ad, точку, возврат каретки, останов и много других отчаянных попыток ответить на вопрос, но ответом всегда служит что-нибудь вроде q не является столицей Бразилии. Попытайтесь еще раз. Как называется столица Бразилии? К сожалению, не существует надежного способа выхода из по- добных программ, а такие программы встречаются во многих об- ластях, не только в области автоматизированного обучения. Все, что мы можем по этому поводу сказать,— это то, что тщетные попытки, предпринятые выше, часто являются нанлучшими. Кроме того, стоит испытать h и ?; эти команды могут вызвать си- стемы помощи, если таковая имеется, и та подскажет вам, как выйти из данной ситуации. Если вы начинаете терять рассудок, то единственный способ выхода из создавшегося положения — это покинуть терминал в надежде, что следующий пользователь, который будет рабо- тать после вас, знает столицу Бразилии и, что еще важнее, знает, как выйти из программы, которую вы использовали. Мусор на экране Если на экране терминала появился беспорядочный набор абсо- лютно случайных литер, то, вероятно, вы попытались вывести на него двоичный файл (или файл, зашифрованный редактором ed). Такой вывод может создать вторичную проблему, состоящую в том, что одна из этих случайных литер может перевести тер-
180 Часть II. Приложение идей минал в некоторый специальный режим. Вам затем придется искать другую такую же случайную литеру, чтобы вновь вернуть- ся к нормальному режиму. Если ничто другое не дает результа- тов, выключите терминал и включите его снова, может быть, по- может. Сообщения об ошибках Рассмотрев общие проблемы, мы теперь перейдем к объяснению более специфичных неполадок. Если вы допустили ошибку при наборе команды, то произойдет одно из следующих действий: • система будет не способна выполнить команду и выдаст сообще- ние об ошибке; • система будет выполнять команду, но не так, как вы этого хотели. Последний случай наиболее неприятный, но, когда вы станете относительно квалифицированным специалистом по системе UNIX, это даст вам возможность зарабатывать деньги. Есть довольно большая категория людей, которые считают, что если UNIX начинает вести себя странно, то ошибка вызвана самой системой, а не ими. «Это не может быть моей ошибкой: все, что я сделал, ..., а эта безумная система обработала это как ... .» Вот момент, когда вы начинаете делать деньги: 99% за то, что ошибка допущена пользователем; поэтому можете заключать пари, что дадите любому пользователю десять акций IBM за каждую ошибку в системе UNIX, которую он найдет, при условии что взамен вы получите одну акцию IBM, если ошибка окажется по вине пользователя. Через год все акции IBM будут ваши. Но вернемся к первому случаю, связанному с выдачей сооб- щения об ошибке при выполнении команды. Вы увидите, что эти сообщения существенно отличаются в различных реализациях UNIX, а сообщения, приведенные в этой книге, необязательно будут соответствовать тем, которые появляются на вашем тер- минале. Однако в общем случае сообщения об ошибках, выда- ваемые системой UNIX, хотя и кратки, но обычно точны и по- лезны. Эти сообщения тем не менее не являются идеальными. (Речь здесь идет о сообщениях об ошибках, выдаваемых коман- дами оболочки. Когда вы входите в такие программы, как ре- дактор, то сообщения об ошибках будут уже другого стиля — стиля, свойственного этой программе. Как мы видели при изу- чении редактора ed, эти сообщения могут быть еще менее идеаль- ными, чем обычные сообщения.) Иногда сообщение будет предупреждать вас,в чем состоит ошибка, например,
Гл. 10. Ошибки 181 $ poetry poetry: команда не найдена. Иногда сообщение будет вам подсказывать, что следует сде- лать, например, $ ср ххх Использование: ср fl f2; или ср fl ... fn с!2 В данном случае вы задали только один аргумент в команде ср, и эта команда вам подсказывает, что для ее использования нужно набрать ср fl f2 (чтобы скопировать один файл в другой) или ср fl ... fn d2 что означает копирование набора из п файлов в каталог d2. (В данной книге мы не рассматривали эту расширенную форму команды ср.) Часто перед сообщением указывается имя команды или файла, в котором возникла ошибка, например если ххх — несущест- вующий файл, то $ cat ххх cat: не могу открыть ххх. $ 1s ххх ххх не найден Эти примеры показывают также, что имеются некоторые несоот- ветствия между сообщениями об ошибках, выдаваемыми различ- ными командами — по крайней мере в нашей реализации UNIX. Сообщение об ошибке от команды cat начинается с «cat:», но 1s выдает другое сообщение, которое не начинается с «1s:» (хотя ошибка для вас, пользователя, одна и та же, что и ошибка в случае cat). В приведенных выше примерах префикс, когда он выдается, не особенно нужен, поскольку вы знаете, какая команда выпол- няется. Однако этот префикс имеет значение, когда вы выполняе- те командный файл, когда вы запустили фоновые процессы или когда вы набрали что-то заранее и исполняется команда, набранная, возможно, тремя строками выше.
182 Часть II. Приложение идей Ошибки, связанные с файлами Сообщение об ошибке типа Не могу открыть ххх. является, вероятно, наиболее частым сообщением об ошибке в UNIX. Оно означает, что к файлу ххх нельзя обратиться либо потому, что он не существует, либо потому, что у вас нет разрешения на его чтение. Если это сообщение вас озадачивает, поскольку вы считаете, что файл ххх существует, и вы имеете разрешение на его чтение, то наиболее вероятно, что причина вашей неудачи кроется в том, что вы находитесь не в том каталоге. В этом случае полезно использовать команду pwd для того, чтобы установить, что является вашим текущим каталогом. Команда pwd на самом деле полезна в более широком контексте, чем в случае, когда вы озадачены ошибкой. Исследователи универси- тетских систем UNIX отмечают, что pwd— одна из наиболее употребительных команд; она бесценна для пытливых студентов, которые исследовали свою файловую систему и заблудились в ней. Если команда pwd не снимает ваших проблем, стоит воспользо- ваться командой 1s, чтобы получить листинг каталога, в котором, по вашему мнению, находится файл ххх. Команда 1s —1 полезна, если вы хотите взглянуть на полномочия, связанные с файлами. Если обращение к вашему файлу осуществляется через марш- рутное имя вида а/Ь/с то может помочь исследование маршрута шаг за шагом, например, cd а cd b cat с Ошибка будет обнаружена на одном из этих шагов. Если вы построили сложную иерархию каталогов, знаете, что файл ххх существует, но не помните точно, где он находится, то можете смело использовать команду find. Эта команда только для отважных, и мы не будем ее описывать в этой книге; отметим только, что find . —name ххх —print будет искать файл ххх в текущем каталоге и во всех его подка- талогах и выведет на экран маршрутное имя (каждого) найден-
Гл. 10. Ошибки 183 ного файла. Поэтому, если вы сделаете текущим свой личный каталог, магическая команда find, приведенная выше, найдет ваш файл. Если потребуется, вы можете сделать текущим ката- логом корневой каталог (/) и осуществить поиск во всей файловой системе, чтобы обнаружить требуемый файл. Это может потребо- вать, однако, много времени. Единственным возможным камнем преткновения может оказаться то, что у вас нет разрешения на чтение или выполнение некоторого каталога, расположенного между начальным каталогом (с которого начинается поиск) и файлом ххх. Ошибки при записи в файлы встречаются реже, чем ошибки при чтении их. Однако такие сообщения, как ххх: не могут создать ххх: нет разрешения ххх: файл существует все же встречаются нередко. Две наиболее вероятные причины этого: • файл ххх уже существует и не имеет полномочия на запись; • каталог, содержащий файл ххх, не имеет полномочия на запись, и поэтому вы не можете создавать внутри его какие- либо новые файлы. Последнее часто случается, когда вы исследуете каталоги дру- гих пользователей. Некоторые оболочки UNIX (например, csh) позволяют предот- вратить катастрофу в случае, когда Великий вредитель разру- шает файл, вводя команду cat > случайныйфайл а случайныйфайл оказывается ценным, уже существующим фай- лом. Вы можете предотвратить это установкой (командой set) переменной с именем noclobber. Это расстроит планы Великого вредителя сообщением «Файл существует». Наихудшая проблема, связанная с записью файлов, возни- кает, когда файловое пространство вашей системы оказывается заполненным, и в этом случае или вы, или какие-либо другие пользователи должны уничтожить старые файлы, чтобы обеспе- чить место для новых. Выполнение команд Если вы попытались выполнить команду X и получили сообщение типа «Команда не найдена» или просто «не найдена», то причина этого состоит в том, что не существует
184 Часть II. Приложение идей файла с именем х ни в одном каталоге из вашего маршрута поиска. (Если вас волнует ваш маршрут поиска, наберите команду set; эта команда может также оказаться полезной при возникно- вении других потенциальных проблем, связанных с вашей сре- дой.) Если в ответ на вашу команду последует х: нет разрешения или х: не могу выполнить то команда х существует, но у вас нет разрешения на ее выпол- нение. Неправильное употребление пробелов в командах оболочки Правило использования пробелов в командах оболочки очень простое: надо набирать один или несколько пробелов перед каждым аргументом. Хотя это правило очень простое, все же начинающие ухитряются не ставить пробелы там, где надо, и ставить их там, где не надо. В обоих случаях наказанием служит то, что команда будет интерпретироваться абсолютно неверно — суровая кара для явно невинного проступка. Например, следующую реакцию вызовет неверное использо- вание пробелов в команде 1s —1 Ошибка 1: пропуск пробела $ Is—1 Is—1: команда не найдена В данном случае 1s—1 воспринимается как имя команды, a UNIX такую команду найти не может. Ошибка 2: лишний пробел $ 1s — 1 1 не найден Эта команда воспринимается как команда с пустой опцией (знак минус сам по себе). Так как между минусом и 1 стоит пробел, то I воспринимается как второй аргумент. В команде 1s вторым аргу- ментом является имя файла — обычно каталога,— информация о котором должна быть распечатана. Файла 1 не оказалось, и по- этому выдается вышеприведенное сообщение об ошибке. (Если бы
Гл. 10. Ошибки 185 случилось так, что у вас был файл с именем 1, то действительно была бы распечатана информация о нем, и вы весьма удивились бы действиям набранной вами команды.) Неумышленное использование металитер Мы уже подчеркивали трудности, вызываемые металитерами в редакторе ed и в меньшей степени металитерами оболочки. На- помним, что команда grep * ххх не осуществляет поиск всех строк файла ххх, которые содержат звездочки. Вместо этого оболочка заменяет звездочку на список имен всех файлов в текущем каталоге, так что вы на самом деле получите весьма странную команду. Поэтому в общем случае, если поведение команды кажется особенно невероятным, стоит посмотреть, не содержит ли эта ко- манда какие-нибудь металитеры. Если вы хотите окончательно в этом убедиться, испробуйте данную команду в качестве аргумен- та команды echo. Например, команда echo grep * ххх сообщила бы нам, во что оболочка преобразовала нашу команду grep. Несколько специфических сообщений Ниже приводится список некоторых специфичных сообщений об ошибках, часто встречающихся и иногда вызывающих недоуме- ние. Плохой каталог Вы пытались в качестве каталога использовать файл, который не имеет должного формата. Такая ошибка, как правило, возни- кает в случае, когда вы ошибочно задаете обычный текстовой файл там, где следовало указать каталог. Разорванный конвейер Одна из команд конвейера ошибочно завершилась и поэтому не передала информацию следующей команде конвейера (или не при- няла информацию от предыдущей команды конвейера). Не могу получить доступ к ххх Эго аналогично невозможности открыть файл: файл ххх не существует или у вас нет разрешения на доступ к нему. ххх: не могу уничтожить ссылку
186 Часть II. Приложение идей Это возникает обычно в случае, когда вы пытаетесь удалить файл командой rm, а разрешения на его удаление не имеете (или из-за полномочий самого файла, или из-за полномочий его ката- лога). Это сообщение может последовать также на команду mv, которая пытается уничтожить старый файл после создания но- вого. Выдан дамп Если вы получите такое сообщение, то это и хорошая, и плохая новость. Плохая новость потому, что обнаружены какие-то ошибки в программе, которую вы использовали. Хорошая новость, поскольку это не ваша ошибка; это ошибка того, кто написал данную программу. (Если программу написали вы, то новость вдвойне плохая.) Это сообщение выдается в тот момент, когда программа пытается сделать что-нибудь невозможное, например деление на нуль или обращение к несуществующей памяти. Когда вы получаете сообщение «Выдан дамп», в вашем текущем каталоге автоматически создается файл с именем core (дамп). Он представляет собой слепок памяти ЭВМ в момент возник- новения ошибки; дамп может быть проанализирован программис- тами с помощью соответствующих средств. Сообщению «Выдан дамп» часто предшествует сообщение о точной причине неисправ- ности; одним из таких сообщений служит загадочное сообщение «Ошибка шины». Отсутствует такой терминал Это сообщение означает, что вы пытаетесь обратиться к термина- лу, которого в системе нет. ххх: режим защиты 400 Полномочия файла ххх не позволяют выполнить текущую опе- рацию. Число 400 (или какое-нибудь другое число, которое вы получаете в сообщении) имеет тот же смысл, что и первый аргу- мент команды chmod. Скверные шутки Наконец, наиболее трудные из всех ошибок возникают в случае, когда ваши добрые друзья разыгрывают с вами скверные шутки, меняя ваш входной командный файл, некоторые из ваших файлов или создавая новые файлы. Каждый из пользователей UNIX может быть в своем роде Макиавелли ni лукаво подсмотрен па- роль и начинается новое дельце. Итальянский писатель начала XVI в., один из идеологов зарож- дающейся буржуазии. Проповедовал культ грубой силы, вероломство, цинизм и т. п.— Прим. ред.
Гл. 10. Ошибки 187 Примером может служить шутка с файловой молью, сыгран- ная нами с Дадли. Это была, конечно, исключительно милая шутка, но вторично разыгранная шутка никогда не бывает ми- лой. Если бы кто-нибудь проделал ее с нами, это было бы ребячеством и напрасной тратой времени. Суть удачной шутки состоит в том, что жертва на нее попадает- ся. Тем не менее, если при входе в систему вы получите сообще- ние о том, что вы соединены с ЭВМ банка и можете редактировать файл, содержащий сумму денег на вашем счете, попытайтесь не за- быть выполнить несколько контрольных проверок, прежде чем затребовать новый «Роллс-Ройс». К хорошим контрольным про- веркам относятся нажатие клавиши останова и ввод таких ко- манд, как 1s —al вывести список всех файлов, с указанием их владельцев и пр.; set показать среду; pwd вывести текущий каталог. Если вы понимаете смысл этих команд, вы сможете также вывес- ти на дисплей свой входной командный файл. Но и не слишком торопитесь; вы можете понаслаждаться некоторое время чувством неограниченного богатства, даже не- смотря на то, что эта иллюзия неминуемо должна разрушиться.
ГЛАВА 11 ПОДГОТОВКА ДОКУМЕНТОВ Привлекательный, как грация, и уверенный на взгляд. Метью Ройден Чтобы документ, будь то техническое руководство или письмо о поиске работы, служил своей цели, он должен хорошо выглядеть и легко читаться. Система UNIX помогает достичь обе эти цели, хотя она все же не может превратить каждого из нас в Брайана Кернигана. Документ сразу привлекает читателя, если он хорошо выгля- дит в смысле заголовков, отступов и т. д. Большая часть этой главы посвящена объяснению использования форматоров текстов UNIX, которые помогают оформлять документы. В конце главы мы кратко рассмотрим некоторые средства UNIX, помогающие писать хорошие тексты. Форматоры текстов Для того чтобы понять, насколько необходим форматор текстов, мы предположим сначала, что его нет. Работая без форматора, вы используете UNIX для подготовки целой главы книги. Вы тщательно выравниваете длины строк, чтобы книга хорошо выглядела при выводе на экран дисплея (например, командой cat). Проверяя главы последний раз, вы замечаете, что пропустили три важных слова в первой строке абзаца. Это уже маленькое бедствие: добавив эти три слова, вы делаете первую строку намного длиннее остальных — возможно,
Гл. 11. Подготовка документов 189 она даже не поместится на бумаге при печати. Поэтому необходи- мо ввести заново весь абзац, чтобы вновь выровнять все строки. Такие процедуры, связанные с потерей времени, обычны для традиционной машинописи и печати. Процитируем инструкцию для корректоров: «Если вы заменяете слово или фразу, подбе- рите замену из такого же количества букв. Если вы не сделаете этого, то придется переделать весь абзац». С использованием средств форматирования текстов, предо- ставляемых UNIX, такие проблемы исчезают. В самом деле, было бы позором, если бы они не исчезли, поскольку даже самые скром- ные системы обработки текстов решают эти проблемы. UNIX содержит программы, которые будут автоматически разбивать текст на строки любого желаемого размера. К основным програм- мам форматирования отйосятся а форматор troff, подготавливающий текст для наборной ма- шины, управляемой ЭВМ; • форматор nroff, подготавливающий текст для устройств, в которых все литеры имеют одинаковую ширину: к ним от- носятся большинство матричных печатающих устройств, пе- чатающих устройств типа «ромашка», построчные печатающие устройства и дисплейные терминалы; таким образом, nroff наверняка пригодится для большинства устройств вывода, которые имеются на вашей ЭВМ. Форматоры nroff и troff тесно связаны, и возможности первого из них (почти все) составляют подмножество возможностей второго. Ваша реализация UNIX может иметь и другие программы се- мейства «roff». В данной книге мы опишем форматор nroff и сделаем это по двум причинам: • если вы знаете nroff, то можете легко приспособиться к другим членам этого семейства; • в большинстве вычислительных систем имеются устройства, для которых подходит nroff, но лишь в немногих имеются на- борные устройства. Хотя nroff проще, чем troff, все же нам пришлось бы посвя- тить ему большую часть книги, если бы мы захотели дать подробное описание всех его возможностей. Наша цель более скромная: мы дадим упрощенное введение в наиболее полезные возможности nroff, так что вы будете знать достаточно, чтобы пользоваться им для большинства задач. Однако, если вам захочется исполь- зовать какое-либо необычное или утонченное средство, следует обратиться к полной документации по nroff, изложенной в руко- водстве для пользователей по NROFFlTROFF. Его можно найти в томе 2 Руководства для программиста системы UNIX.
190 Часть II. Приложение идей Предоставляемые возможности Знакомство с nroff мы начнем с его основных возможностей. Они состоят в следующем. Nroff будет разбивать документы на страницы с заголовком и номером на каждой странице, если требуется. Форматор nroff сумеет сделать и нижние колонтитулы — текст, помещаемый внизу страницы. В некоторых документах, например, в качестве нижнего колонтитула используется дата. (Nroff сможет, где надо, сделать и сноски, но это понятие отлично от нижнего колон- титула.) Nroff будет автоматически заполнять и выравнивать текст. Эти процессы дополняют друг друга, и мы начнем с первого из них. Заполнение состоит в добавлении слов к каждой строке вывода до тех пор, пока в строку не поместится больше ни одного слова. Это гарантирует, что все строки будут иметь примерно равную длину, но не сделает их в точности одинаковыми. Некото- рые строки будут короче, чем строка максимальной длины. На- пример, если в процессе заполнения строки в ней осталось место на 3 буквы, а следующее слово состоит из четырех букв, то не- обходимо начать новую строку. Поэтому рассматриваемая строка будет на три литеры короче максимальной. В общем случае не- которые строки итогового документа будут иметь полную длину, некоторые будут на одну литеру короче, некоторые — на 2 ли- теры короче и т. д. Поэтому у страницы будет неровное правое поле. Большинство бумаг, подготовленных на обычных пишущих машинках, страдают этим недостатком. Процесс выравнивания обеспечивает выпрямление неровных полей. Это осуществляется вставкой дополнительных пробелов между словами в строке, для того чтобы растянуть строку на полную длину. Поэтому, если строка на три литеры короче, будет добавлено три дополни- тельных пробела (или на некоторых хороших печатающих уст- ройствах шесть полупробелов). Почти в каждой книге текст вы- равнивается таким образом, что делает его более приятным на вид. Следующий пример изображает фрагмент текста, который имеет очень неровное правое поле — этот текст не заполнялся и не выравнивался. Применение форматора nroff для форматирования текста оказывает неоценимую помощь любому писателю независимо от того, пишет ли он книгу или письмо. Достоинством nroff является то, что вы можете постепенно изучать новые возможности, так что ваши документы будут становиться все лучше и лучше. Если вы передадите этот текст для обработки форматору nroff, он выведет его в заполненной и выровненной форме следующим
Гл. 11. Подготовка документов 191 образом (мы показываем этот вывод в том виде, в каком он полу- чился бы при использовании алфавитно-цифрового печатающего устройства с длиной строки 42 символа). Применение форматора nroff. для форматиро- вания текста оказывает неоценимую помощь любому писателю независимо от того, пишет ли он книгу или письмо. Достоинством nroff является то, что вы можете постепен- но изучать новые возможности, так что ваши документы будут становиться все лучше и лучше . Обратите внимание на дополнительные пробелы в первых двух строках. Они вставлены во вторую половину первой строки, но в первую половину второй строки. Такое чередование является отличительной особенностью хорошего форматора текстов; оно придает выводимому тексту однородный вид. Дополнительно к процессам заполнения и выравнивания nroff будет автоматически осуществлять перенос слов с одной строки на другую. Он вы- полняет эту операцию изящно и не дробит слова в произвольных местах. Вы видите, что слово «форматирование» в приведенном выше тексте было перенесено, тем самым удалось избежать лишних дополнительных пробелов. Однако, если вам не понра- вятся переносы, делаемые nroff, можете выключить их. Nroff предоставляет различные шрифты. Вообще говоря, шрифт — это набор литер одного стиля. Шрифт может включать все буквы алфавита (как прописные, так и строчные), цифры от О до 9 плюс все общепринятые знаки пунктуации. Наборные устройства предоставляют литеры всевозможных размеров и видов. Стоит сравнить лишь две различные книги или книгу и журнал, чтобы получить впечатление о разнообразии возможнос- тей. Однако возможности устройства, на которые рассчитан nroff, более ограничены. Как правило, они располагают лишь тремя шрифтами, которые имеют один и тот же размер и связаны с одним и тем же стилем печати. Этими шрифтами являются; • прямой светлый шрифт; • полужирный, позволяющий выделять текст. Полужирный шрифт часто моделируется на печатающих устройствах путем удара одной и той же литерой несколько раз, возможно, каждый раз с небольшим смещением; • курсив, наклонное расположение литер. Только небольшое число устройств вывода ЭВМ располагают настоящим кур- сивом. Как правило, вместо этого литеры, которые должны
192 Часть II. Приложение идей быть набраны курсивом, подчеркивают и этим достигается желаемый эффект: эти литеры выделяются. Наконец, nroff помогает размещать текст внутри страниц. Он позволяет делать абзацы, отступы, заголовки разделов и тому подобные вещи. В последующих разделах мы объясним, как использовать некоторые из этих возможностей. Однако, как мы предупреждали •' ранее, мы будем придерживаться основного направления; если вас заинтересуют, например, нижние колонтитулы или сноски, вам придется самим ознакомиться с документацией по nroff. ' Некоторые советы При подготовке документов начинающие обычно допускают две ошибки. Первая связана с тем, что они мыслят только категория- ми конкретного печатающего устройства или дисплея. Если вы допустите такую ошибку, то поплатитесь, когда ваше любимое печатающее устройство заменят на более «мощное» или когда понадобится перенести документ в другую вычислительную сис- тему. Различные устройства вывода могут порождать самые раз- ; личные образы документа. Можно избежать этих проблем, если мыслить категориями, на которых базируется сам документ, а не его конкретный образ. Поэтому думайте об абзацах и разде- лах, а не о пустых строках и пробелах, используемых для их представления. Кроме того, думайте о курсиве, а не о подчерки- вании, которое в некоторых устройствах применяется вместо курсива. Вторая ошибка — это когда начинающий сходит с ума от мощных возможностей, предоставляемых форматором. К счастью, мы не будем рассматривать некоторые из действительно пагубных средств, доступных в nroff и troff. Однако, используя даже такую простую возможность, как выравнивание, можно перегнуть палку. Помните, что, хотя выровненный документ может выгля- деть профессионально, дополнительные пробелы, введенные для выравнивания строк, могут сделать документ менее удобным для чтения. Метод использования Некоторые форматы текстов можно использовать в интерактив- ном режиме, т. е. вы набираете неформатированный текст и сра- зу же видите, как выводится прекрасно оформленный документ. Nroff таким способом не используется. Вместо этого вы готовите входной текст в файле, а затем подаете этот файл на вход в nroff; например, если входные данные находятся в файле mybook, то вы используете команду
Гл. 11. Подготовка документов 193 nroff опции mybook Мы расскажем о полезных опциях позднее. Когда вы первый раз будете анализировать вывод nroff, то наверняка заметите ошиб- ки — возможно, все отступы будут неверными. Затем вы ис- правите ошибки путем редактирования входного файла и вновь подадите его на вход в nroff. Для начинающих этот неинтерактивный метод работы утоми- телен и обычно непривлекателен. Несмотря на это, некоторые профессионалы охотно отказываются от преимуществ интерактив- ного режима, поскольку их могут компенсировать достоинства, предоставляемые неинтерактивными форматорами текстов. Эти достоинства не очевидны для начинающих. Грубо говоря, они «связаны с гибкостью». Ваш входной текст является как бы nroff- программой, порождающей итоговый документ. Вы можете де- лать систематические изменения в этой программе, чтобы на- строиться на различные окружения. Аналогичная ситуация воз- никает с языками программирования: начинающему может нравиться интерактивный Бейсик, в то время как профессионал может предпочитать неинтерактивный Паскаль. Вывод на терминал Даже в том случае, если конечный результат работы nroff дол- жен быть напечатан, все же можно анализировать результаты на дисплейном терминале. Однако дисплейные терминалы обыч- но не имеют полужирного шрифта и курсива, поэтому вы не- сколько теряете в наглядности. Тот, кто хочет произвести впечатление, подготавливает свою электронную почту при помощи nroff, например, nroff myletter | mail аппе Чаще всего вывод nroff переадресовывается в файл, например, nroff myletter >myfile Затем вы можете проанализировать выходной файл myfile на дисплее, прежде чем напечатать его или отправить по почте. Если вы будете исследовать выходной файл с помощью редак- тора ed и просматривать строки с помощью команды 1, то увидите, как представляются литеры полужирного шрифта и курсива (в предположении, что таковые содержатся в вашем файле). Как уже говорилось, полужирный шрифт моделируется возвратом на шаг и повторной печатью той же литеры — действие, которое вы не видите, если литеры выводятся на дисплейный терминал, разве что у вас исключительно острый глаз, 7 №161
194 Часть II. Приложение идей Вывод nroff обычно заканчивается массой пустых строк, кото- рые заполняют последнюю страницу. Это может несколько раз- дражать при выводе на дисплей, так как размер экрана дисплея обычно меньше, чем размер страницы, используемый для печа- тающих устройств. Подготовка входных данных Если вы подаете на вход в nroff файл, содержащий некоторый обычный текст, который вы подготовили, прежде чем узнали о существовании nroff,— его называют сырым текстом — то nroff сделает его лучше. Однако если вы хотите по-настоящему рабо- тать с форматором nroff, то должны подготовить свой документ с учетом его возможностей. В частности, в документ необходимо вставить запросы nroff, чтобы указать, какие строки должны начинаться с отступов, где стоят заголовки разделов, какие ли- теры должны быть выделены курсивом или полужирным шрифтом. (Пользователи nroff значительно скромнее других: они выдают «запросы», а не «команды».) Большинство запросов начинаются с точки и занимают одну строку. Ниже приведен пример входных данных для nroff, которые содержат запросы nroff: С этими людьми были проведены консультации и все они согласны с моим предложением .in +10 .nf Бриан Джонс Джоан Браун Берт Смит .fi .in —10 Поэтому я приступаю к реализации своей идеи. Я предполагаю закончить к лету. Приведенный текст содержит четыре запроса — четыре строки, начинающиеся с точки. Запрос .in + 10 вызывает сдвиг всего, что следует далее, на десять пробелов вправо по отношению к предшествующим строкам. Запрос .in —10
Гл. 11. Подготовка документов 195 вызывает обратное действие и поэтому восстанавливает первона- чальную границу текста. Таким образом, эта пара запросов дей- ствует как пара скобок, ограничивающих сдвигаемые строки. Два других запроса, использовавшиеся в примере,— это nf и fi. Они означают соответственно не заполнять (по fill) и заполнять (fill). По запросу nf форматор прекращает процесс заполнения последующих строк; вместо этого входные строки выводятся без изменения. Запрос fi отменяет действие nf и застав- ляет nroff возобновить нормальный процесс заполнения и вырав- нивания текста. (Вы можете, если желаете, выключить вырав- нивание независимо от заполнения. Это делается в том случае, если вас устраивает неровный правый край.) В приведенном примере мы хотим, чтобы три имени — Бри- ан Джонс, Джоан Браун и Берт Смит — располагались на отдель- ных строках точно так же, как во входном тексте. Для этого мы используем запрос nf. Если бы этот запрос был опущен, то на выходе все имена попали бы в одну строку: Бриан Джонс Джоан Браун Берт Смит По окончании списка имен мы восстанавливаем заполнение, ис- пользуя запрос fi. Поэтому последующий текст заполняется. Выходной документ, соответствующий нашим входным дан- ным, выглядит так: С этими людьми были проведены консультации и все они согласны с моим предложением Бриан Джонс Джоан Браун Берт Смит Поэтому я приступаю к реализации своей идеи. Я предполагаю закончить к лету. Обратите внимание, что пустые строки во входных данных перене- сены в выходной документ. Во входных данных пустая строка была перед первым именем и после последнего имени, чтобы улуч- шить вид текста. Комментарии Nroff располагает огромным числом возможных запросов, только малая часть которых описана в этой книге. Имена запросов сос- тоят из двухлитерной аббревиатуры выполняемой функции (на- пример, запрос in для отступа (indent)). Для того чтобы сделать входной файл для nroff более легким для понимания и измене- 7*
г.„иИ1иимо желательно после запросов помещать коммен- тарии. Они записываются следующим образом: .in + 10 \"отступ в 10 пробелов Как видите, комментарий следует за запросом и начинается с обратной косой черты и двойной кавычки. Прерывание страницы и строки Общая философия nroff состоит в следующем. Имеется несколько автоматических механизмов, разработанных с таким расчетом, чтобы придать документу форму, которая требуется большинству пользователей. Тот, кто желает изменить автоматический режим, может использовать для достижения своих целей специальные запросы. Например, nroff автоматически разбивает текст на страницы. Обычно nroff заполняет текстом каждую страницу полностью, но, если вы хотите прервать заполнение текущей страницы и на- чать новую, можете воспользоваться запросом: .Ьр Рассмотрим второй пример. Мы уже видели, что, хотя nroff обычно заполняет (и выравнивает) текст, вы можете выключить этот механизм с помощью запроса nf. Кроме того, в режиме за- полнения текста вы можете заставить nroff перейти на новую строку (т. е. прервать строку), выдав запрос Ьг. В качестве при- мера ранее приведенный список имен можно было бы записать в виде Бриан Джонс •Ьг \" начать новую строку Джоан Браун .Ьг \"вновь начать с новой строки Берт Смит Такая запись альтернативна применению запросов nf и П. Когда вы впервые будете использовать nroff, вас, возможно, удивят прерывания строк, но вскоре вы привыкнете управлять разбиением своих выходных строк. Макроопределения Запросы форматора nroff в основном являются запросами низ- кого уровня, и вскоре вы почувствуете, что их употребление утомительно и часто приводит к ошибкам. Чтобы облегчить эту проблему, nroff располагает несколькими файлами макросов (макроопределений). Эти макросы как бы расширяют встроенный
Гл. 11. Подготовка документов репертуар запросов, предоставляя дополнительные запрос которые являются более мощными и легкими для использован! В большинстве реализаций nroff доступно несколько альтерг тивных файлов макросов; каждый такой файл содержит связа ный набор макросов, разработанный для документов определе кого типа. Эти файлы макросов называются макробиблиотеками Одной из наиболее популярных является макробиблиотека т; созданная в Bell Laboratories. Она применима для широкое диапазона документов. Механизм макросов так удобен и естествен, что • обычному пользователю nroff не нужно знать, что такое макрос, • новые запросы, обеспечиваемые макросами, могут с некото- рыми оговорками использоваться совместно со встроенными запросами, которые мы уже рассмотрели. Все, что вам нужно сделать, чтобы получить доступ к макробиб- лиотеке ms,— это включить опцию —ms в команду nroff, напри- мер, nroff —ms входной-файл >выходной-файл В этом случае вы получаете дополнительный арсенал запросов. Эти новые ms-запросы представляются прописными буквами, например, РР, в то время как встроенные запросы nroff представ- ляются строчными буквами. Оставшаяся часть этой главы в основном посвящена рассмот- рению макросов из макробиблиотеки ms. Мы рекомендуем вам использовать библиотеку ms при подготовке документов. Возмож- но благодаря своему успеху идеи, заложенные в макробиблиоте- ке ms, были использованы и развиты в других макробиблиотеках. Вы можете не найти макробиблиотеки ms в своей системе UNIX, но обязательно найдете что-нибудь подобное. Одной из произ- водных библиотек ms является макробиблиотека mm; эта биб- лиотека использует аналогичные концепции, что и макробиб- лиотека ms, но, к сожалению, имена запросов в этих библиотеках существенно различаются. Существует только два исключения из нашей рекомендации использовать макробиблиотеку ms (или одну из ее производных): • короткие документы, скажем, на одну-две страницы. Когда вы применяете библиотеку ms, nroff затрачивает несколько се- кунд, прежде чем начать обработку документа, и эта задержка может оказаться неприятной в случае коротких документов; • документы со специальными требованиями. Позднее мы об- судим препроцессоры и макробиблиотеки. отв<^'—- рода потребностям.
198 Часть II. Приложение идей Придерживаясь своей методики изложения самого главного, мы не будем объяснять каждый отдельный запрос в библиотеке ms. Читателям, которым требуется подробная информация, следует обратиться к руководству Подготовка документов в системе UNIX-, использование макробиблиотеки —ms с форматорами Т г off и Nroff; оно содержится в томе 2 Руководства для програм- миста системы UNIX. Краткую информацию о запросах ms можно получить, если набрать команду man 7 ms Абзацы и разделы Одна из ценных услуг, предоставляемых макробиблиотекой ms,— это простой набор запросов для оформления абзацев и разделов документа. Почти каждый документ делится на абзацы. В учебных посо- биях наподобие этой книги абзацы группируются в разделы, где каждый раздел имеет заголовок. Заголовком раздела, который вы читаете в настоящий момент, является «абзацы и разделы». В некоторых работах заголовки разделов нумеруются, например, «1. Введение». Запросы для управления абзацами и разделами следующие: РР означает начало абзаца с отступом в первой строке; LP означает начало абзаца без отступа в первой строке; SH означает заголовок раздела; NH означает то же, что и SH, с той разницей, что заголовки автоматически нумеруются по порядку; IP означает начало сдвинутого абзаца; сдвигается весь текст абзаца. Такие запросы мы называем запросами абзаца или заголовка. Все запросы абзаца или заголовка записываются на отдельных строках, а после них следует текст абзаца или заголовка. Текст (даже заголовка) может быть какой угодно длины. Конец абзаца или заголовка указывается следующим запросом абзаца или за- головка. Такой запрос не только завершает один абзац или за- головок, но также вводит следующий абзац или заголовок. Един- ственным исключением является самый последний абзац доку- мента, для которого конец ничем не указывается — он просто оканчивается по концу ввода. Часть документа, использующая эти запросы, может принять следующий вид: .SH Пример заголовка раздела .LP
Гл. 11. Подготовка документов 199 Это текст первого абзаца. Его первая строка не имеет отступа, так как мы использовали запрос LP, а не РР. .РР Это текст другого абзаца. Его первая строка начинается с отступа, поскольку мы использовали запрос РР, но последующие строки этого абзаца идут без отступа. .SH Еще один пример заголовка раздела .LP Первый и единственный абзац в этом разделе. Концом этого абзаца является конец текста. Каждый из запросов, начинающих абзац или заголовок, автома- тически вызывает вывод дополнительной пустой строки, чтобы Пример заголовка раздела Это текст первого абзаца. Его первая стро- ка не имеет отступа, так как мы использо- вали запрос LP, а не РР. Это текст другого абзаца. Его первая строка начинается с отступа, поскольку мы использовали запрос РР, но последующие строки этого абзаца идут без отступа. Еще один пример заголовка раздела Первый и единственный абзац в этом разде- ле. Концом этого абзаца является конец текста. Рис. 11.1. Вывод абзацев и заголовков. улучшить вид текста. Заголовки раздела автоматически выделя- ются полужирным шрифтом. Так, приведенный выше входной текст выводится в виде, показанном на рисунке 11.1. Аргументы Некоторые запросы содержат аргументы — мы уже видели при- меры таких аргументов в запросе in, в котором аргумент опреде- лял требуемый отступ. Аргументы запросов nroff, подобно аргу- ментам команд оболочки, записываются непосредственно после запроса и отделяются друг от друга пробелами. Если сам аргу- мент содержит пробелы, то весь этот аргумент должен быть зак- лючен в пару двойных кавычек, например,
200 Часть II. Приложение идей .хх "Аргумент, содержащий пробелы" два три Этот гипотетический запрос содержит три аргумента. Обратите внимание, что применение двойных кавычек здесь отличается от их применения в оболочке, где для таких же целей использу- ются одиночные кавычки. Сдвинутые абзацы Запрос IP часто содержит один аргумент, а иногда и два. Первый аргумент является меткой этого сдвинутого абзаца. Второй ар- гумент задает желаемый отступ. Если второй аргумент опущен, то делается стандартный отступ, такой же, как и отступ в первой строке абзаца, получаемого по запросу РР. В качестве примера рассмотрим следующий входной текст: .РР Есть три способа доехать туда .IP (1)\"второго аргумента нет автобусом от вокзала Виктория .IP (2)\"вновь нет второго аргумента поездом: .IP "(2 А)" 10\"отступ в десять литер от Виктории .IP "(2 В)" 10 от Чаринг-Кросс .LP Я предпочитаю последний вариант, так как дорога проходит по живописной сельской местности. Обратите внимание, что аргумент "(2 А)" заключен в двойные кавычки, так как он содержит пробел. Вышеприведенный вход- ной текст преобразуется в вывод: Есть три способа доехать туда (1) автобусом от вокзала Виктория (2) поездом: (2 А) от Виктории (2 В) от Чаринг-Кросс Я предпочитаю последний вариант, так как дорога проходит по живописной сельской местности.
Гл. 11. Подготовка документов 201 Заметим, что окончание каждого сдвинутого абзаца отмечается обычным путем с помощью другого запроса абзаца или заголов- ка. В приведенном выше примере каждый из сдвинутых абзацев, кроме последнего, завершается следующим запросом IP. Послед- ний сдвинутый абзац оканчивается запросом LP, восстанавлива- ющим исходную границу текста. Иллюстрации Документы часто содержат рисунки, таблицы или программы. Желаемый способ их оформления обычно не охватывается прави- лами оформления простых предложений и абзацев, поскольку такие понятия, как выравнивание и заполнение, здесь неприме- нимы. Часто наилучший для вас способ работы с такого рода ма- териалом состоит в том, чтобы вы сами, а не nroff занимались его оформлением; затем вы передаете подготовленный материал, заключенный в запросы-скобки DS и DE, в качестве входных данных для nroff. Ниже приведен пример такого текста, называ- емого иллюстрацией: .РР После полудня отходят поезда: .DS 15:00 от Чаринг-Кросс 15:23 от Виктории 15:30 от Чаринг-Кросс 15:53 от Виктории .DE Если вы поедете трехчасовым поездом, то вам придется сделать пересадку в Ашфорде. Запросы-скобки DS и DE оказывают на заключенные в них стро- ки следующее действие: ® эти строки размещаются со сдвигом (несколько большим, чем стандартный отступ первой строки абзаца); ® к этим строкам не применяется процесс заполнения — они остаются точно такими же, какими подавались на вход; © вместо DS и DE вставляются пустые строки; • эти строки, если возможно, размещаются вместе таким об- разом, чтобы все они попали на одну страницу. Поэтому, если nroff в двух строках от конца страницы встречает иллю- страцию, которая занимает 4 строки, он начинает новую страницу. Эта возможность существенна для таблиц, кото- рые выглядят ужасно, если переносятся на другую страницу. Механизм DS и DE отличается от механизмов оформления аб- зацев. После запроса DE возобновляется предыдущий абзац.
о приведенном примере весь материал принадлежит одному и тому же абзацу. Если бы мы захотели начать новый абзац после запроса DE, нам пришлось бы расположить в этом месте запрос РР. Предложение «Если вы поедете...» будет в этом случае начи- наться с отступа. Наши входные данные (в том виде, как они при- ведены выше) дают следующий вывод: После полудня отходят поезда: 15:00 от Чаринг-Кросс 15:23 от Виктории 15:30 от Чаринг-Кросс 15:53 от Виктории Если вы поедете трехчасовым поездом, то вам придется сделать пересадку в Ашфорде. Эта книга1’ приготовлена с использованием форматора nroff (и позднее troff); DS и DE были двумя из наиболее активно ис- пользуемых запросов. Они полезны даже в том случае, когда иллюстрация состоит из одной строки, например Напечатано: .DS Команда не найдена. .DE Это означает, что ... Этот текст выводится в виде Напечатано: Команда не найдена. Это означает, что. . . При подготовке табличного материала полезно использовать литеры табуляции, подобные тем, что имеются в пишущих ма- шинках. Вы можете установить позиции табуляции в форматоре nroff запросом ta. Например, Ла 8 16 30 48 60 устанавливаются позиции табуляции с отступами в 8, 16, 30, 48 и 60 литерных позиций. При появлении литеры табуляции (Д1 на некоторых клавиатурах, в которых нет специальной клавиши та- буляции) в этом случае происходит скачок на следующую из 11 11 Имеется в виду английский оригинал,— Прим. ред.
Гл. 11. Подготовка документов 20с этих позиций табуляции. При табуляции всегда происходит вы- вод как минимум одного пробела. Помните, что запрос ta управ- ляет лишь выводом nroff. Когда вы набираете литеру табуляции во входном файле, она может выглядеть по-другому, так как здесь действуют стандартные позиции табуляции, принятые в UNIX. Однако на выходе все должно быть нормально. Препроцессоры Мы предполагали, что вы сами оформляете свои таблицы и другие иллюстрации. Однако, если у вас есть сложные таблицы или формулы, стоит узнать, какую еще помощь вам может оказать система UNIX. Во-первых, вы можете обнаружить, что ваша сис- тема располагает некоторыми макросами, специально предназна- ченными для ваших нужд; об этом мы расскажем позднее. Во- вторых, вам следует научиться пользоваться препроцессорами для nroff. Такие препроцессоры концептуально похожи на макро- сы в том смысле, что обладают эффектом расширения nroff, но используются по-другому. Препроцессоры автоматически генери- руют запросы nroff нижнего уровня (т. е. создают для вас часть nroff-программы) и используются как фильтры в конвейере. Один из препроцессоров называется tbl и предназначается для генерации таблиц. Пример команды, использующей tbl: tbl myfile | nroff —rns >outputfile Если у вас возникают трудности с таблицами, обратитесь к доку- ментации по tbl, это поможет вам разрешить их. Другим ценным препроцессором является препроцессор neqn (или eqn, для форматора troff), который имеет дело с форматиро- ванием математических формул. Без использования neqn тре- буется титаническая работа, чтобы удовлетворительно сформати- ровать сложные формулы. Вы можете обнаружить, что ваша система содержит и другие препроцессоры, приспособленные для местных потребностей. В научно-исследовательской организации, например, может быть препроцессор для цитирования статей из научных журналов. Мы не приводим более подробную информацию об этих пре- процессорах, поскольку все они имеют специальное, а не общее назначение. Шрифты Три шрифта, доступные в nroff, представляются следующими буквами: R прямой светлый шрифт; I курсив-, В полужирный шрифт.
204 Часть II. Приложение идей По умолчанию весь текст, за исключением некоторых заголовков, выводится прямым светлым шрифтом. Для изменения шрифта используется запрос ft, в котором в качестве аргумента указы- вается буква, представляющая желаемый шрифт; например Запрос .ft В ft .ft R изменяет шрифт. порождает вывод Запрос ft изменяет шрифт. Дополнительно к буквам R, I и В может использоваться бук- ва Р. Она означает предыдущий шрифт, т. е. шрифт, который ис- пользовался до того, как вы его изменили последним запросом ft. Можно изменить шрифт внутри строки, Ha6pas\f с последую- щей буквой, указывающей желаемый шрифт. Так, вышеприве- денный пример можно было бы переписать в виде Запрос \fBft\fP изменяет шрифт. Такая запись короче, но значительно более трудна для чтения, чем предыдущая. Первое и третье употребление буквы f определя- ет шрифт, а второе ее применение — это настоящая буква f. Вероятно, вы обратили внимание, что мы использовали буквы Р, а не R, чтобы вновь перейти на прямой светлый шрифт. Это хоро- ший стиль работы с nroff. Его достоинство состоит в том, что если вы позднее решите сменить шрифт данного предложения с прямо- го светлого на курсив, то вам не нужно менять само предложе- ние: все, что вы делаете,— это вставляете дополнительные за- просы ft с обеих его сторон .ft I Запрос \fBft\fP изменяет шрифт. .ft R Исходное предложение менять не нужно, поскольку буква Р восстанавливает теперь курсив, а не прямой светлый шрифт. Использование обратной косой черты В предыдущем разделе мы видели, как обратная косая черта использовалась для объявления запроса nroff — в нашем слу- чае для изменения шрифта — внутри строки. Внутри входной строки можно вызвать множество других возможностей nroff;
Гл. 11. Подготовка документов 205 каждый такой вызов начинается обратной косой чертой. Многие из этих возможностей довольно специфичны, но для обычных пользователей важно то, что использование механизма обратной косой черты позволяет вводить литеры, которые, как правило, отсутствуют на клавиатурах терминалов. Примером служит конструкция \(bu означающая жирную точку, т. е. литеру «•». Жирная точка час- то используется в качестве аргумента запроса IP, чтобы пометить сдвинутый абзац. Вы можете найти многочисленные применения жирных точек, если внимательно просмотрите эту книгу. Большинство печатающих устройств не снабжены литерой «•», но nroff моделирует ее, печатая букву х поверх буквы о. В nroff существует около сотни специальных литер, представ- ляемых в виде \(хг где хх — некоторая уникальная пара букв. Вы можете получить буквы греческого алфавита, математические символы, символы авторского права и разного рода другие литеры, которые удивят ваших друзей. Если вы захотите воспользоваться такими ли- терами, обратитесь к Руководству для пользователя по NROFF/ TROFF, вы можете напасть на золотую жилу. Однако, чтобы в точности воспроизвести такие литеры, необходимо высококачест- венное печатающее устройство или даже наборная печатающая машина. Запрещенные знаки Использование обратной косой черты форматором nroff приводит нас вновь в мир запрещенных знаков, который уже хорошо зна- ком пользователям реактора ed или оболочки. Если вы действи- тельно хотите, чтобы обратная косая черта появилась в выводе, следует набрать пару литер \е. Необходимо также избегать ис- пользования точки или закрывающей кавычки (знаки острого ударения) в начале входных строк. Это связано с тем, что оба эти знака помечают строку как запрос nroff, а не как строку текста. (В книге мы начинаем все запросы с точки; закрываю- щая кавычка подобна ей, но она позволяет избежать прерыва- ние вывода.) Если вы действительно хотите поместить точку или закрывающую кавычку в начале строки, то поставьте перед ней обратную косую черту и амперсанд, например, Элементы, которые меня раздражают в \fBnroff\fP: .DS обратная косая черта
206 Часть II. Приложение идей точки в начале строк \& ... .DE На выходе получим Элементы, которые меня раздражают в nroff: обратная косая черта точки в начале строк Ошибки Отшл достиг своего идеального совершенства при выдаче сооб- щений об ошибках в nroff: большинство сообщений об ошибках в nroff абсолютно пусты. Так, если вы допустите ошибку в запросе nroff, набрав, например, запрос РР в виде •РР (что не является правильным запросом), то этот неверный запрос презрительно игнорируется. Эффект, который видит пользова- тель, состоит в том, что два абзаца сливаются в один, поскольку один из запросов пользователя, задающий начало нового абзаца, был отвергнут. Еще хуже, если пользователь забыл указать оп- цию —ms в своей команде nroff; в этом случае будут игнориро- ваться все его макрозапросы. Однако существует способ, как частично перехитрить отшл. Многие реализации UNIX снабжены командой checknr файл . .. которую можно использовать для проверки всех запросов nroff в данном файле(ах). Команда checknr не идеальна, поскольку она пропускает некоторые запросы, которые сам nroff будет обраба- тывать как ошибочные, но это все же намного лучше, чем полное молчание. Поэтому мы советуем при подготовке для nroff нового документа или изменении существующего документа применять следующую последовательность команд оболочки: (1) Используйте редактор для создания и (или) изменения до- кумента. Будем предполагать, что результирующий доку- мент помещается в файл masterpiece. (2) Выполните команду checknr masterpiece (3) Выполните одну из команд nroff —ms masterpiece >afile
Гл. 11. Подготовка документов 207 или nroff —ms masterpiece | aprogram где aprogram может быть чем угодно от Ipr, которая печатает свои входные данные, до mail. Когда вы используете первую из при- веденных выше команд nroff, вы можете взглянуть на afile, выведя его на свой терминал; если он вас удовлетворяет, можете подать этот файл на вход aprogram. Если вы не пользуетесь макросами ms, следует опустить опцию —ms в приведенных выше командах. Домашний стиль Многие издательства разработали «домашний» стиль: набор пра- вил пунктуации, установки интервалов, оформления текста и т. д., который предназначен для того, чтобы сделать книги привлека- тельными и единообразными. В учреждениях подобные правила установлены для машинописных документов. Документ, выпол- ненный машинисткой, которая руководствуется правилами, будет выглядеть значительно лучше, чем документ, напечатан- ный рядовым любителем. В следующих нескольких разделах мы рассмотрим некоторые принятые в nroff соглашения, касающиеся интервалов, и увидим, как они связаны с одним конкретным правилом стиля — прави- лом задания интервалов между предложениями. Вашей первой реакцией, возможно, будет желание игнориро- вать эти правила: без сомнения, вы будете удовлетворены, если получите от nroff что-либо приемлемое, а педантичные правила стиля будут иметь второстепенное значение. Тем не менее мы надеемся, что когда-нибудь вы решите раз- работать свой собственный «домашний» стиль. Это позволит превратить посредственный документ в хороший. К сожалению, успех документа часто определяется его внешним видом, а не его содержанием. Если вам доведется подготавливать документы для наборных устройств, вы получите большое удовольствие, изучив немного искусство наборщика делать документ приятным на вид. Пробелы и знаки пунктуации Обычное правило разделения предложений в машинописных до- кументах — оставлять два пробела после точки в конце каждого предложения, Чтобы способствовать этому соглашению, nroff обладает специальным свойством, состоящим в том, что если в конце входной строки стоит точка, то он автоматически вставляет после этой точки два пробела. (Естественно, это не делается, если точка оказывается в конце выходной строки — дополнитель-
208 Часть 11. Приложение идей ные пробелы в этом случае не нужны.) Строго говоря, мы должны были сказать, что nroff вставляет как минимум два пробела после точки, поскольку иногда он добавляет дополнительные пробелы для выравнивания строки. Nroff не предпринимает каких-либо специальных действий, когда встречает точку внутри входной строки. В этом случае вы сами должны поместить два пробела пос- ле точки. При этом используется общее свойство nroff, состоящее в том, что каждый пробел во входном тексте дает как минимум один пробел в выходном тексте. Поэтому считается, что если вы набрали дополнительные пробелы во входном тексте, то вы дей- ствительно имеете в виду, что они там должны быть. (Аналогич- но, если вы помещаете пробел в начале строки, nroff воспроизво- дит этот пробел, а также считает, что вы хотите прервать предыду- щую и начать новую строку ) Для иллюстрации этих особенностей рассмотрим входной текст Он пришел. Он увидел. Он победил. Он — После первой точки стоит только один пробел, поэтому она спе- циальным образом не обрабатывается. После второй точки стоят два пробела, поэтому они переносятся в выходной текст. Третья точка размещается в конце строки, и поэтому после нее добавля- ются два пробела. Таким образом, на выходе получим Он пришел. Он увидел. Он победил. Он — Придирчивый читатель будет протестовать против такого вывода, поскольку недостающий пробел после первой точки будет раздра- жать его (хотя для документов, выполненных на наборном уст- ройстве, в отличие от напечатанных на машинке действуют дру- гие эстетические правила). Предложение необязательно должно оканчиваться точкой: оно может оканчиваться восклицательным или вопросительным знаками Поэтому nroff распространяет аналогичные правила и на эти знаки. Если вы хотите избежать осложнений, пользуйтесь следую- щими двумя правилами при подготовке входных данных для nroff: • начинайте каждое предложение с новой строки; • избегайте лишних пробелов. Если у вас нет желания выполнять первое правило, не забывайте добавлять дополнительный пробел после предложений, которые оканчиваются в середине входной строки.
Обратите внимание, что для nroff точка — это просто литера «.»; он не так умен, чтобы отличить точку, заканчивающую пред- ложение, от любого другого использования литеры «.», напри- мер ее применения в сокращении «и т. д.». Отсюда вывод, что следует избегать написания слов типа «и т. д.» в конце входных строк, если только они не заканчивают предложение. В против- ном случае тупоголовый nroff будет добавлять дополнительные пробелы. Точно так же, как nroff воспринимает дополнительные пробе- лы как значащие, он воспринимает дополнительные пустые строки так же, как значащие,— мы уже говорили об этом. Поэтому надо быть осторожным и не использовать пустых строк понапрасну. Если во входном тексте содержится конец одного абзаца. .РР Начало следующего ... то эти абзацы будут разделены двумя пустыми строками. Пустая строка на входе дает одну строку, а запрос РР — вторую строку. Сырой текст Одно из назначений правил nroff, связанных с пробелами и пус- тыми строками, состоит в том, что они не позволяют обрабаты- вать сырой текст разумным образом. Например, если при подготовке документа не думали в даль- нейшем использовать nroff, то промежуток между абзацами мо- жет выглядеть в нем следующим образом: конец одного абзаца. Начало следующего ... Этот текст содержит пустую строку между абзацами и отступ длиной в пять пробелов перед словом «Начало». Nroff воспроиз- водит все это в выводе, и поэтому промежуток между абзацами в выходном тексте точно отражает входной текст. Хотя пользо- ватель, подающий сырой текст в форматор nroff, не использует всех возможностей последнего, он все же получает выгоду от заполнения и выравнивания текста и деления текста на страни- цы. С другой стороны, он может столкнуться с двумя новыми проблемами. Во-первых, если во входном тексте содержится таб- личный или иллюстративный материал, то к огорчению пользова- теля nroff попытается «заполнить» такой материал путем упаков- ки нескольких строк в одну. Поэтому пользователю может пот- ребоваться вставить в свой документ запросы nf и fi (или DS и DE). Во-вторых, если в документе пользователя не соблюдаются
210 Ч асть II. Приложение идей соглашения о точках внутри строк, он получит несообразный вы- вод: за точками, оказавшимися в конце входных строк, будут вставляться два пробела, в то время как за другими — лишь один. (Магическим образцом в редакторе ed для нахождения то- чек, за которыми следует только один пробел, служит /\. [A —Z]/ Обратитесь к Дадли, чтобы он разъяснил вам эту запись, если вы не можете ее понять самостоятельно, несомненно в качестве награды он предложит вам еще более умный образец. Мы могли бы, между прочим, с пользой для дела воспользоваться этим об- разцом, чтобы облегчить себе редактирование романа о Греге Деймлере, который содержит только по одному пробелу после каждой точки.) Размер страницы и интервалы Устройства вывода ЭВМ существенно различаются размерами страниц и строк. Кроме того, в пределах физических ограниче- ний на размеры страниц пользователи могут менять отступы и интервалы по вертикали. Поэтому nroff представляет запросы для управления форматом страниц. Большинство из этих запросов имеет аргумент, задающий физическое расстояние. Эти расстоя- ния могут быть заданы в различных единицах измерений, как показано в следующих примерах: 10i 10 дюймов; 26с 26 сантиметров, 7m 7 эм; в nroff это означает 7 литер, но в troff, где литеры могут иметь различную ширину, это означает семикрат- ную ширину буквы «М» — отсюда название «эм»; 7п 7 эн; в nroff эн — это то же, что и эм, но в troff эн, будучи шириной буквы «N», составляет половину эм; 8 8 подразумеваемых единиц; для горизонтальных ин- тервалов подразумеваемой единицей измерения служит эм, адля вертикальных интервалов подразумеваемой еди- ницей измерения по умолчанию служит интервал между строками, т. е. расстояние от опорной линии одной стро- ки до опорной линии следующей строки; +9 9 подразумеваемых единиц сверх предыдущего значения; —2с на 2 сантиметра меньше, чем предыдущее значение. Мы уже встречались с примерами, аналогичными последним двум, в запросах in: .in + 10 .in —10
Гл. И. Подготовка документов 211 Первый из них вызывает дополнительный отступ в 10 подразуме- ваемых единиц (эм); во втором случае отступ сокращается на 10 эм, т. е. приводится к предыдущему состоянию. Примеры за- просов in с другими единицами измерений: .in 1с .in Зп Еще несколько примеров запросов, в которых уже использова- лись подразумеваемые единицы: .1Р "(2 А)" 10 Ла 8 16 30 48 60 Теперь мы приведем примеры других запросов. В каждом из них могут использоваться любые из приведенных выше еди- ниц измерения расстояния, хотя в примерах показан только один специальный случай. Длина страницы .pl 10i устанавливает длину страницы размером в 10 дюймов. Запрос pl может, однако, вызвать трудности, если вы используете макро- библиотеку ms, так как последняя может подразумевать опре- деленный размер страницы. Длина строки .nr LL 70 \"если вы используете макробиблиотеку ms .11 70 \"если вы не используете ms устанавливает длину строки равной 70 эм. Пустые строки .sp 3 выводит три пустые строки. Поскольку это вертикальный, а не горизонтальный интервал, подразумеваемой единицей измерения является интервал между строками. Если sp не содержит аргу- мента, то выводится одна пустая строка — такой же эффект может быть достигнут пустой входной строкой. Двойной интервал .1s 2 вызывает вывод дополнительной пустой строки после каждой выходной строки. Таким образом, получается вывод через два интервала — отсюда число 2. Это полезно для черновиков, по- скольку остается достаточно места для внесения исправлений.
212 Часть II. Приложение идей Центрирование Наконец, есть еще один запрос, связанный с интервалами, ко- торый вообще не использует никаких единиц измерения. Это за- прос се, который центрирует текст, заданный в следующей вход- ной строке. Центр есть центр независимо от единиц измерения. Следующий пример показывает использование запросов се и sp для порождения титульных строк документа. .сё \ДВДружите с UNlX\fP .sp .се Дадли и Анна .sp 2 .РР UNIX помогает людям общаться... Этот входной текст вызывает вывод Дружите с UNIX Дадли и Анна UNIX помогает людям общаться. . . Среды Мы видели, что форматор nroff предоставляет большое число параметров для управления выходным текстом: примерами слу- жат установка интервалов между строками, установка позиций табуляций и текущий шрифт. Набор текущих значений всех этих параметров называется средой. На самом деле вы можете рабо- тать с тремя альтернативными средами и переключаться с одной среды на другую. Это средство для профессионалов, но оно касается и рядовых пользователей, когда они используют за- просы DS и DE. Текст, находящийся внутри этой пары запросов, имеет среду, отличную от среды остального текста. В результате можно столкнуться с несколькими сюрпризами. Например, если вы поместите запрос .is 2 в начало своего входного текста, это приведет к двойному ин- тервалу везде, кроме текста внутри запросов DS и DE. Это связано с тем, что последний имеет отдельную среду, на которую действие данного запроса 1s не распространяется.
Гл. 11. Подготовка документов 213 Другим примером может служить случай, когда перед за- просом DE, который завершает некоторую иллюстрацию, ис- пользуется полужирный шрифт (возможно, потому, что вы забыли вновь переключиться, на прямой светлый шрифт); в этом случае текст, расположенный после следующего запроса DS, вклю- чающий, возможно, еще 500 строк, будет выводиться полужир- ным шрифтом. Это вызвано тем, что DS восстанавливает среду, бывшую перед предыдущим запросом DE. Начало документа Если вы будете готовить документ большой длины, то, вероятно, захотите оформить его лучше, чем наш пример Дружите с UNIX, введя специальную титульную страницу. Рекомендуется делать это следующим образом: TL Заголовок документа .AU Автор (ы) •AI Служебный или домашний адрес автора(ов) .АВ Аннотация, описывающая содержание документа .АЕ\"отмечает конец аннотации .РР\"или .SH, за которым следует заголовок раздела Отсюда начинается текст документа Вы можете не использовать любой из указанных разделов. На- пример, можно опустить запрос AI и связанный с ним текст. Каждый фрагмент текста (показанный курсивом) может иметь произвольную длину. Приведем конкретный пример использования этих запросов: .TL Дружите с UNIX ,AU Дадли Анна .АВ Эта статья рассказывает о том, как в системе UNIX общаться со своими приятелями и избежать внимания тех, кто вам не нравится. .АЕ .SH Давайте знакомиться .РР
214 Часть II. Приложение идей UNIX помогает людям общаться друг с другом. Вы можете использовать для этого команды \fBmail\fP и \fBwrite\fP. ... Выходной текст изображен на рис. 11.2. Такое начало докумен- та производит значительно большее впечатление, чем предыду- щий вариант. Кроме самой титульной страницы вам может понадобиться вставить в самое начало документа инструкции, управляющие Дружите с UNIX Дадли Анна АННОТАЦИЯ Эта статья рассказывает о том, как в системе UNIX общаться со своими прия- телями и избежать внима- ния тех, кто вам не нравится. Давайте знакомиться UNIX помогает людям общаться друг с другом. Вы можете использовать для это- го команды mail и write. ... Рис. 11.2. Титульная страница. форматом всего документа. Если вы заглянете в документацию по макробиблиотеке ms, то найдете, как задавать верхние и нижние колонтитулы на страницах и даже как разбивать стра- ницы на несколько колонок. По умолчанию вверху каждой страницы помещается ее но- мер, а внизу — текущая дата. Если вы не используете макробиблиотеку ms, то все же можете управлять верхними и нижними колонтитулами, но вам придется все это запрограммировать, самим используя соответ- ствующие запросы nroff. В противном случае документы могут получиться как бы состоящими из одной огромной страницы.
Гл. 11. Подготовка документов 215 Макробиблиотеки Макробиблиотека ms является хорошим средством общего на- значения для подготовки документа, но для специальных целей она может оказаться для вас неподходящей. В этом случае можно воспользоваться двумя альтернативными решениями: • использовать другой набор макросов, • написать свои собственные макросы. Первый подход, очевидно, предпочтительнее, поскольку вы со- храняете свои силы, используя усилия других. Поэтому стоит выяснить, какие макробиблиотеки имеются в вашей системе UNIX. Вы найдете их описания в разделе 7 Руководства для программиста системы UNIX. Если вы хотите написать свои собственные макросы, то преж- де всего должны познакомиться с уже существующими макро- сами, написанными специалистами, например с самой макро- библиотекой ms. Ее можно найти в файле /usr/lib/tmac/tmac.s Если вы (командой cat) посмотрите этот файл, то будете шокированы: он заполнен отпугивающе непонятной информа- цией типа .de I .nr PQ \\n(.f .if t .ft 2 .if "\\$1""q .if n .ul 1000 .if !"\\$1""q .if n .ul 1 .if f .W !"\\$1"" \&\\$1\\f\\n(PQ\\$2 .if n .if \\n(.$ = 1 \&\\$1 .if n .if \\n(.$> 1 \&\\$1\\c .if n .if \\n(.$>1 \\&\\$2 He отчаивайтесь. Написание полной макробиблиотеки, такой же мощной как ms, действительно задача не для простых смерт- ных. Однако не составляет большого труда написать набор из дюжины или около этого макросов дополнительно к существую- щей библиотеке, чтобы удовлетворить свои собственные потреб- ности. Сказав, что это «не составляет большого труда», мы еще больше поиграем на доверчивости читателей, заявив, что, не- смотря на это, мы не можем рассмотреть этот вопрос из-за огра- ничения размера книги.
*1U часть 11. Приложение идей Справочные страницы В гл. 9 отмечалось, что справочные страницы руководства по системе хранятся во внутренней форме, которая затем преобра- зуется в подходящий для устройства вывода формат. Справочные страницы на самом деле имеют формат nroff (или troff); когда для просмотра справочной страницы используется команда man, то man запускает nroff, чтобы преобразовать данную справоч- ную страницу в соответствующий формат для вывода. Теперь, когда вы немного уяснили nroff, интересно взгля- нуть на справочные страницы в том виде, как они хранятся в ЭВМ. В большинстве реализаций UNIX справочные страницы раздела 1 Руководства для программиста системы UNIX на- ходятся в каталоге с именем /usr/man/manl, хотя в вашей си- стеме это может быть не так. Справочная страница для 1s хра- нится в файле с именем Is. 1 (в других системах UNIX это имя может быть другим, но содержит 1s). Если вы примените к этому файлу команду cat, то увидите пример входного текста для nroff. Справочные страницы используют макробиблиотеку, назы- ваемую макробиблиотекой man; она похожа на макробиблио- теку ms, но не идентична ей. В справочных страницах исполь- зуется также большое число встроенных запросов nroff — за- просов с именами из строчных букв. Опасные комбинации Если вы почитаете документацию по nroff, то еще больше по- полните свой запас запросов. Однако будьте осторожны при совместном использовании запросов ms (имеющих имена из про- писных букв) с остальными; примером может служить одновре- менное использование запросов ms для оформления колонтитулов страниц со своими собственными хитроумными запросами низ- кого уровня для порождения колонтитулов. В результате эти два механизма скорее всего войдут в противоречие друг с другом и создадут хаос. Скромный набор запросов nroff, описанных в этой книге, может довольно свободно смешиваться с запросами ms, при условии что вы не запрашиваете что-либо действительно без- рассудное. Удостоверьтесь, однако, что вы пользуетесь версией ms запроса 11, как было показано в ранее приведенном примере установки длины строки. Использование наборного устройства Некоторые документы, хотя они первоначально и готовились для простых печатающих устройств с использованием nroff, могут в дальнейшем быть выведены на наборное устройство. Ваш ро-
Гл. 11. Подготовка документов 217 ман принят издательством; некто публикует о вас книгу под названием Избранные письма пользователя UNIXIusrltne', более прозаический пример: объявления о собрании пользователей вашей ЭВМ, которые вы готовите с использованием системы UNIX, должны быть набраны на наборном устройстве, чтобы они выглядели более профессионально. Если вы хотите, чтобы ваш файл был набран набором, маловероятно, что на вашей ЭВМ имеется необходимое наборное устройство. В связи с этим вам придется послать файл посредством электронной почты, магнитной ленты или гибкого диска в другую систему UNIX, в которой есть форматор troff и соответствующее оборудование. Результатом такой операции может стать превосходный до- кумент. Если, однако, у вас есть какой-либо опыт работы с ЭВМ, вы должны понимать, что ничто не происходит так гладко, как вы ожидаете (даже в том случае, когда вы не ожидаете мно- гого в первый раз). Трудности преобразования входных дан- ных, рассчитанных на nroff, для использования в troff в основ- ном возникают потому, что наборные литеры отличаются по ширине: например, буква «i» намного уже, чем «w». Средняя ширина литер сравнительно меньше, чем эм, которая является шириной литеры в выходном тексте nroff. Вторая проблема со- стоит в том, что если вы мыслите лишь категориями nroff, то будете использовать одинаковые литеры в качестве дефиса, тире и минуса. Эти проблемы могут проявиться следующим образом: • сделанный вами отступ в 10 подразумеваемых единиц (эм) хорошо выглядит вnroff, посмотрится намного более широким для troff; • выравнивание столбцов в таблицах в troff неправильное, так как литеры имеют различную ширину; • все тире и минусы выводятся в виде дефисов, которые выгля- дят абсурдно маленькими. (Аналогично все кавычки могут выводиться в виде закрывающих перевернутых запятых, как в ’х’, поскольку пользователи nroff не привыкли различать кавычки и апострофы.) Даже тогда, когда вы справитесь с этими проблемами, вам при- дется дополнительно адаптировать свой документ, чтобы восполь- зоваться преимуществами, которые предоставляет troff по срав- нению с nroff, такими как более широкий набор шрифтов и спо- собность менять размеры литер (например, печатать заголовки прописными буквами). Отсюда следует вывод, что если вы принадлежите к катего- рии сверхорганизованных людей, которые думают на много хо-
218 Часть II. Приложение идей дов вперед, стоит уделить внимание требованиям, предъявляе- мым форматором troff, когда вы будете разрабатывать свой соб- ственный домашний стиль. Независимость от печатающих устройств Одно из достоинств макробиблиотеки ms состоит в том, что она делает ваш документ более независимым от устройства вывода; такой документ можно адаптировать для любого печатающего устройства. Мы уже подчеркивали нежелательность привя- занности к определенному печатающему устройству. Где уместно, макросы ms автоматически приспосабливают вывод к исполь- зуемому печатающему устройству, и на самом деле это сглажи- вает переход от nroff к troff. До некоторой степени макросы ms позволяют вам также изменять свой стиль: если вам не нравится стиль оформления текста, предоставляемый некоторыми макро- сами, вы можете их изменить. Так вы можете изменить вид абзацев, написав новый макрос РР — однако предупреждаем, что вмешательство любителей часто приводит к катастрофическо- му результату. Когда вы используете команду оболочки, которая вызывает troff или nroff, вы можете задать аргумент, который сообщает, какое печатающее устройство вы планируете использовать; это приводит к тому, что вывод nroff будет адаптироваться соот- ветствующим образом. Например, nroff —ms —Т1234х myfile >outputfile Outputfile будет передан затем на печатающее устройство мо- дели 1234х. Модель 1234х абсолютно гипотетическая; вам по- требуется выяснить, какие специальные опции печатающего устройства, если они есть, имеются в вашей версии nroff. Если вы обнаружите, что nroff не ладит с вашим устройством вывода, часто проблема может быть решена использованием правильной опции —Т. Резюме о форматировании Для большинства людей создание хороших документов — прият- ная задача. Однако она требует внимания к мелочам. Форматором nroff овладеть нелегко, но он обладает значи- тельно большими возможностями, чем многие из его на первый взгляд привлекательных конкурентов. Большинства проблем удастся избежать, если изучать nroff постепенно, а не стремитель- ным натиском. Можно порекомендовать следующие этапы:
Гл. 11. Подготовка документов 219 • разузнайте о имеющихся в распоряжении печатающих устрой- ствах вплоть до наборных устройств, которые, возможно, будут использоваться в перспективе; • ознакомьтесь с несколькими образцами входного текта для nroff, разработанными коллегами, которые уже овладели nroff. Еще важнее попытаться найти документы, близкие по тематике к вашим; • начните с выполнения нескольких экспериментов с nroff, применяя короткие документы; • прежде, чем начнете создавать свой первый настоящий доку- мент, выработайте свой собственный домашний стиль; придер- живайтесь его постоянно; • используйте макробиблиотеку ms, кроме случаев создания небольших документов, таких как письма, или документов, к которым предъявляются специальные требования; • возьмите на вооружение команду checknr, чтобы попытаться найти ошибки, прежде чем передать текст в nroff; • относитесь к неудачам как к поводу посмеяться, а не попла- кать. Список запросов Этот раздел завершает описание nroff. Так как плохо написан- ный документ все же является плохим, даже если он прекрас- но оформлен, мы посвятим последующие разделы этой главы литературному качеству текста. Данный заключительный раздел по nroff суммирует все запросы, которыми мы пользовались. Встроенные запросы Ьр начать новую страницу; Ьг прервать строку (т. е. начать новую строку); се поместить следующую строку(и) посередине страницы; fi заполнять последующий текст (отменяет nf); ft изменить шрифт; in изменить отступ; 11 установить длину строки; 1s установить интервал между строками, nf не заполнять последующий текст; пг установить «числовой регистр» — мы пользовались этим запросом для установки LL; pl установить длину страницы; sp вывести пустую строку(и); ta установить позиции табуляции. Кроме этого, для изменения шрифта внутри строки могут исполь- зоваться запросы\ДВ, \fl и т. д. По умолчанию весь текстовой материал заполняется и выравнивается.
220 Часть II. Приложение идей Запросы из макробиблиотеки ms DE конец в иллюстрации; DS начало иллюстрации; IP сдвинутый абзац; LP абзац без отступа; NH заголовок раздела с номером; РР абзац, первая строка которого начинается с отступа; SH заголовок раздела. Кроме того, для оформления титульной страницы можно исполь- зовать запросы АВ, АЕ, Al, AU и TL. Средства для улучшения качества текста В UNIX имеется три средства для улучшения качества текста: команды spell, style и diction. Первое из них мы уже рассмотрели. степень читаемости: (Kincaid)10.2 (auto) 10.2 (Coleman—Liau) 9.9 (Flesh) 10.7 (56.5) Информ о предложениях: число предл 179 число слов 3506 ср длина предл 19.6 ср длина слова 4.63 число вопр предл 2 число воскл предл О число нефункц слов 1869 53. 3% ср длина 6.04 корот предл (< 15) 35% (63) длинн предл (>30) 11% (20) наиб дл предл 79 слов в предл 13; наиб корот предл 4 слов в предл 15 типы предложений: простые 35% (62) сложные 45% (81) сложно-сочин 7% (13) сложно-подчин 13% (23) использование слов: типы глаголов в % от общего числа глаголов tobe 38% (162) вспом 23% (97) инфин 14% (61) пассив в % к неинфин глаголам 11% (41) типов в % от общего числа предлоги 9.7% (339) союзы 2.7% (93) нареч 5.7% (201) имя существ 24. 1% (845) определ 13. 6% (477) местоим 8. 6% (301) нарицат 1% (43) начало предложений: открывает подлеж: имя существ (28) местоим (24) притяж (4) определ (16) артик (34) всего 60% предлог 11% (20) нареч 12% (21) глагол 3% (5) подчин союз 12% (22) союз 0% (0) сорные слова 2% (4) Рис. 11.3. Вывод программы style. Программы style и diction, по словам их создателей (Cherry, Vesterman, 1981), служат «первым шагом в оказании помощи авторам в создании удобочитаемых документов». Грубо говоря,
Гл. 11. Подготовка документов 221 программа style рассматривает документ как целое, a diction анализирует отдельные слова документа 11. Мы передали одну из глав этой книги на вход в программу style. Результат обработки приведен на рис. 11.3. Здесь так много информации, что первоначально это пугает, однако настойчи- вость в ее изучении будет вознаграждена. Степень читаемости Первая часть информации касается степени читаемости: при- ведены четыре различные оценки, хотя все они примерно одина- ковы и попадают в диапазон от 9.9 до 10.7. Все эти оценки бази- руются на длине предложений и длине слов: единственная раз- ница между четырьмя оценками состоит в том, что используются чуть отличающиеся формулы. Предположим, что для начала вы обращаете внимание только на первую оценку, полученную по формуле Кинкейда (Kincaid). Оценка Кинкейда сама по себе не представляет интереса; она полезна только при сравнении с соответствующими оценками, полученными для других доку- ментов. Если один документ содержит более низкий показатель, чем другой, то это означает, что он состоит из более коротких слов и предложений. Вообще говоря, благодаря этому документ легче читать, хотя имеется предел: в книге для детей младшего возраста степень читаемости может упасть до 5, но большинство взрослых, хотя, конечно, и находят чтение таких книг легким, не считают их стиль привлекательным (как и их содержание, хотя это уже другое дело). Наш показатель 10.2 уже имеет низкое значение. Анализ документов в Bell Laboratories дает среднее значение степени читаемости по Кинкейду 13.3. Максимальное значение составляло 16.9, а минимальное 9.5. Советуем вам применить style к своим документам и сравнить степень читаемости по Кинкейду с оценками, приведенными нами, и с оценками, которые вы можете получить для файлов, принадлежащих вашим друзьям. Если ваш текст окажется слишком простым или слишком сложным, это должно послужить предупреждением для анализа собственного стиля. Следует ожидать изменения показателя степени читаемости в зависимости от типов документов. Допустимо высокое значение степени читаемости для части литературной критики, но для технических документов лучше иметь низкое значение этого показателя: у читателя будет достаточно хлопот с усвоением П Style означает стиль, a diction — дикцию. Следует иметь в виду, что эти программы (как и spell) разработаны для английского языка.— Прим. ред.
222 Часть II. Приложение идей новых технических понятий, и он не должен отвлекаться на рас- путывание длинных предложений или поиск значений длинных слов в словаре. Информация о предложениях Следующие два раздела вывода программы style содержат ин- формацию о структуре предложений. Хорошие авторы переме- жают длинные предложения с короткими. (Вот почему детские книги, содержащие в избытке короткие предложения, не привле- кательны для взрослых.) Поэтому, если вы видите, что ваши по- казатели стиля существенно отличаются от показателей ваших друзей, то вам следует проанализировать структуру предложе- ний и их распределение. Не слишком страшитесь массы деталей, выдаваемых командой style. Такие элементы, как нефункциональные слова (которые на самом деле являются именами существительными, наречиями и невспомогательными глаголами), можно игнорировать, пока вы не научитесь как следует интерпретировать спектр сообщений, который вам предоставляет style. Использование слов Хотя подсчеты частей речи делаются программой slyle кое-как, они могут все же подсказать вам, что ваш стиль не совсем хорош. Например, чрезмерное использование прилагательных можно допустить в книжках для воскресного чтения, но в других до- кументах это вскоре начнет раздражать читателя. Избыток пас- сивных глаголов служит сигналом опасности в технических документах, так как во многих книгах по стилю и в экспери- ментах на понимание показано, что глаголы в активной форме воспринимаются легче. Наконец, почти полное отсутствие место- имений может указывать, что текст излишне многословный. Способ открытия предложений Нас отчасти удивила последняя строка вывода команды style: наша глава, оказывается, содержит четыре сорных слова. Раз- бирается ли style в том, какие слова сорные? В ответ узнаем, что сорные слова — это не то, что мы думали. Это такие слова, как «it» и «there», стоящие в начале предложе- ний, в которых подлежащее следует за сказуемым, например, There are three files used by the program. (Имеются три файла, используемые этой программой.)
Гл. 11. Подготовка документов 223 Многие авторы слишком часто используют такие безличные обо- роты, и некоторые критики реагируют на них как на сорные слова. Если вы взглянете на последние пять строк рис. 11.3, то увидите полный анализ частей речи, с которых начинаются (от- крываются) предложения. Хороший стилистический принцип — менять способ открытия предложений. Если style показывает, что вы редко открываете предложения с определенных частей речи, можете улучшить стиль, расширив свой репертуар. Резюме о style Программа style дает некоторую сырую статистику. Эта статис- тика даже не является точной, так как style не всегда в состоя- нии определить, где предложения начинаются, а где заканчи- ваются, или являются ли такие слова, как «need» (нужда, нуж- даться) или «beat» (бой, бить), именами существительными или глаголами. Эта статистика тем не менее представляет ценность. Если вы являетесь исключительно одаренным автором, то показатели, выданные для вас программой style, могут существенно отли- чаться от средних; в самом деле, отклонение от нормы может подтвердить исключительное превосходство вашего стиля. Од- нако на каждого автора, стиль которого выделяется своей ге- ниальностью, найдется 10 авторов, чьи излияния невозможно читать. Если вы подозреваете, что можете оказаться одним из них, исследуйте вывод команды style и посмотрите, не пытается ли она дать вам полезные советы. Команда diction Программа diction намного проще, чем style, а ее сообщения значительно более понятны. Diction просматривает отдельные слова или фразы и выделяет те из них, которые обычно исполь- зуются неправильно. Например, некоторые специалисты по стилю утверждают, что слово very в значении «очень» надо из- жить. Diction выводит на дисплей каждое предложение, которое содержит это слово. Например, она выводит it was alvery] warm day (стоял очень теплый день). Слово или фраза, против которой diction протестует, помещается в квадратные скобки. Diction не пытается понять или сделать грамматический раз- бор документа. Когда она встречает слово very, она протестует против него независимо от контекста. Так она может вывести:
224 Ч асть II. Приложение идей that is the [very] reason why I kept quiet (именно по этой при- чине я молчал) Весьма маловероятно, чтобы такое использование слова very (в смысле «та самая») кого-либо обидело, однако программа diction недостаточно умна, чтобы отличить это использование слова very от какого-либо другого. Другими примерами вывода программы diction, взятыми из гл. 2 этой книги, могут служить: (1) moreover you might have a [number of] sessions in a day (кроме того, вы можете провести несколько сеансов в день). Здесь diction обиделась на выражение «number of» (несколько). Она предпочитает альтернативные слова, такие как «several» (несколько) или «many» (много). (Обратите внимание, что dic- tion преобразует прописные буквы во входном тексте в строчные: первое слово «Кроме», превратилось в «кроме».) (2) [the nature] of messages sent obviously depends on the user commu- nity (характер посылаемых сообщений, очевидно, зависит от общества пользователей). В данном случае diction объявляет нам, что слово «the nature» (природа, характер) не несет большой смысловой нагрузки и может быть исключено, если переписать предложение по-дру- гому. (3) a machine [which] only allows... (ЭВМ, которая допускает работу только...). В данном случае вместо «which» предпочтительнее слово «that» (которая). Если вы захотите получить разъяснение, почему diction отвергает те или иные слова или фразы, то в большинстве реали- заций UNIX найдете программу-компаньон для diction, которая предоставит вам такие разъяснения. Она может называться explain или suggest. Реакция Список слов и фраз, которые не нравятся diction, насчитывает около 500 отдельных единиц. Обладая таким большим списком антипатий, diction непременно найдет что-либо нежелательное даже в небольшом документе. Команда diction имеет, однако, одно достоинство по сравне- нию с тещей и тестем: вы можете ее не слушать. Если вас раздра- жает ее придирчивость, то можете оставить ее в одиночном зак-
Гл. 11. Подготовка документов 225 лючении внутри файловой системы и никогда не приглашать для просмотра своих документов. Изгнание diction — одна крайность; потакание каждому ее капризу — другая крайность. Лучше всего придерживаться золотой середины. Опыт использования diction в Bell Labora- tories показывает, что типичный пользователь реагирует только примерно на половину ее замечаний и бодро игнорирует осталь- ные. Резюме о всех средствах Сообщение о всех средствах UNIX, описанных в этой главе, можно подытожить следующим образом: если вы хотите созда- вать красивые и легко читаемые документы, вам придется серьез- но поработать. В виде форматора nroff UNIX предоставляет адекватное средство для форматирования, которое позволяет усердным пользователям создавать действительно прекрасные документы, а заурядным пользователям — получать сносные документы. Средства UNIX для улучшения стиля текста менее адекватны. Это неизбежно: учителя могут несколько лет учить своих уче- ников хорошо писать по-английски, но их труд часто оканчива- ется полной неудачей. Глупо ожидать, что простые программы могут сделать это лучше. Поэтому не ждите, что style и diction помогут вам, если вы пользуетесь словами неуклюже, ваши объяснения двусмысленны и нет единого плана изложения мате- риала. Тем не менее эти программы могут помочь вам в некото- рых технических аспектах стиля и как результат сделать доку- мент из нечитабельного приемлемым. Авторы этих двух програм?>1 заслуживают большого уважения за то, что сделали многообе- щающий первый шаг в область, которая в будущем может стать очень плодотворной. 8 №161
ГЛАВА 12 ПРОГРАММИРОВАНИЕ Меня вы научили говорить На вашем языке. Теперь я знаю, Как проклинать,— спасибо и за это. Пусть унесет чума обоих вас И ваш язык. Шекспир, *Буряъ (Перевод .'И. Донского) Эта глава знакомит с использованием системы UNIX для написа- ния программ. Если вы решили никогда не писать никаких программ, вы можете, конечно, пропустить эту главу. Мы, од- нако, хотим сделать некоторую скидку для начинающих, поэтому начнем с введения в языки программирования — таким образом более подготовленные читатели могут также кое-что пропустить. Для остальных мы будем вводить материал посредством анало- гий. Языки программирования Французы считают, что французский язык намного лучше всех других. Англичане, с другой стороны, считают, что английский язык лучше французского и уж подавно лучше американского.
Гл. 12. Программирование 227 В настоящее время вы разговариваете с ЭВМ с помощью языка программирования, а не разговорного языка. В мире столько же языков программирования, сколько и разговорных языков, и люди равно убеждены, что их язык программирования намного превосходит любой другой. Правда, нельзя утверждать, что один язык программирования лучше другого, с той же уверенно- стью, с какой можно сказать, что английский язык лучше аме- риканского. Все, что можно сказать,— это то, что некоторые языки программирования более подходят для определенных задач, скажем для обработки коммерческих записей или для проведения сложных вычислений. Из-за разнообразия взглядов на языки программирования любая операционная система общего назначения должна поддер- живать большое число таких языков. Эти языки реализуются языковыми процессорами (которые можно подразделить на компиляторы и интерпретаторы). Сотни различных языковых процессоров были написаны для UNIX, но только некоторые из них, вероятно, доступны в каждой конкретной реализации. Поэтому вам придется выяснить для себя, какие именно языко- вые процессоры и соответственно какие языки программирования поддерживаются вашей системой UNIX. Вы всегда обнаружите, однако, что система поддерживает язык С, поэтому мы начнем со знакомства с этим языком. Разработка языков программирования Природу языка С легче понять, выяснив, для чего он разработан. Идеальный язык программирования имеет следующие свой- ства: (1) он легок для начинающих; (2) он легок для специалистов; (3) он позволяет легко читать программы; (4) он дисциплинирует пользователей и таким образом застав- ляет их следовать хорошему стилю программирования; (5) он подходит для написания коротких программ; (6) он подходит для написания программ среднего размера; (7) он подходит для написания больших программ, содержащих десятки или сотни тысяч строк; (8) он подходит для доказательства правильности программ; (9) он легок для реализации на любой ЭВМ; (Ю) он позволяет эффективно (т. е. быстро) выполнять про- граммы. Невозможно разработать язык программирования, который удовлетворял бы всем этим критериям. (Тем не менее люди пыта- 8*
228 Часть II. Приложение идей ются это делать, и новые языки программирования рождаются ежедневно.) На практике разработчики удачных языков сосре- доточиваются на нескольких критериях. Разработчики языка Бейсик выделяют в качестве наиболее важных критериев (1) и (5). Разработчик языка Паскаль оценивает свойство (4) как наи- более важное, и считает важными также позиции (3) и (10). Разработчики языка Ада охватили свойство (7), и это заста- вило их пойти на компромиссы со многими другими желательны- ми критериями. Разработчики языка С выделяют критерии (10), (6) и (2) как наиболее важные, возможно, в этой последовательности. Если эти критерии важны для вас или вы хотите использовать уникальную роль С как «языка системы UNIX», то язык С — это ваш язык. Сравнение программ Для того чтобы вы смогли сопоставить язык С с уже известными вам языками, мы приведем одну и ту же программу, написанную на языках Бейсик, Паскаль и С. Эта программа вводит целое число N, за которым следуют N других чисел, и вычисляет среднее значение этих N чисел. Примером возможных входных данных (в предположении, что N равно 4) является: 4 3.6 2.9 —4.15 28.64 Это, конечно, тривиальная программа, и она не дает полного представления о возможностях языков программирования. Од- нако она будет полезна для того, чтобы получить первое впечат- ление. Программа на Бейсике выглядит следующим образом: 10 REM----------ПОИСК СРЕДНЕГО ИЗ N ЧИСЕЛ----------- 100 INPUT N 110 LET S = 0 120 FOR K = 1 TO N 130 INPUT X 140 LET S=S-|-X 150 NEXT К 200 IF N < = 0 THEN 230 210 PRINT "СРЕДНЕЕ ="; S/N 220 GOTO 999 230 PRINT "НЕТ ЧИСЕЛ В ПОТОКЕ ДАННЫХ" 999 END Назначение инструкции IF в строке 200 — сделать программу устойчивой: если вводятся какие-либо нелепые данные, например
Гл. 12. Программирование 229 —123 в качестве N, то программа не портится. Вместо этого она печатает сообщение: НЕТ ЧИСЕЛ В ПОТОКЕ ДАННЫХ На Паскале программа выглядит так: program average (input, output); {— — — поиск среднего из N чисел — — —} var n, k: integer; sum, number: real; begin read(n); sum := 0; for к := 1 to n do begin read (number); sum := sum -|- number end; if n > 0 then writein ("Среднее=", sum/n) else writein ("Нет чисел в потоке данных") end. На языке С программа записывается так: /# — — — поиск среднего из N чисел — — — */ #include <stdio.h> main () { int п, k; float sum, number; scanf("°/od",&n); sum = 0; for (k=sl; k <= n; k-f-+) { scanf("%f",&number;.; sum -j-= number; if (n > 0) printf("CpeflHee = %f\n", sum/n); else printf("HeT чисел в потоке данных\п");
230 Часть II. Приложение идей Общее впечатление Мы начнем с разбора некоторых общих свойств программ на язы- ке С и их отличий от программ на Бейсике и Паскале. Затем мы проанализируем строка за строкой приведенную выше программу на языке С и объясним некоторые ее детали. Если вы не про- граммист, то можете встретить затруднения при разборе этих деталей, однако мы надеемся, что вы по крайней мере получите некоторое представление о том, что происходит. Первое впечатление при взгляде на приведенные выше про- граммы — это то, что язык С ближе к Паскалю, чем к Бейсику. Это более чем просто внешнее сходство, так как лежащие в основе С идеи действительно довольно близки к Паскалю, несмотря на различные цели этих языков. Одна из причин явного внешнего различия программ на С и на Бейсике состоит в том, что про- граммы на Бейсике создаются строка за строкой в интерактивном режиме, тогда как программы на языке С (и на Паскале) —• нет. Вы готовите программу на языке С в виде файла, пользуясь ре- дактором, а затем передаете этот файл языковому процессору С. В Бейсике, с другой стороны, вы набираете строки программы непосредственно в языковом процессоре Бейсика; языковые про- цессоры Бейсика имеют свой собственный встроенный редактор, который использует номера строк в начале каждой строки. Даже первый взгляд на программу на языке С показывает, что язык С базируется на той же самой основе, что и UNIX, и, в частности, разделяет ее философию о том, что синтаксис должен быть кратким. Чтобы проиллюстрировать это, полез- но взять за точку отсчета Паскаль. Версия на Паскале приведен- ной программы обильно наперчена зарезервированными словами, которые являются английскими словами и имеют фиксированный смысл в Паскале. Примерами зарезервированных слов служат program, var, begin, end, for, to и do. В языке С гораздо меньше зарезервированных слов, а те, что есть, довольно короткие, на- пример for и if. Во многих случаях в языке С опущены зарезер- вированные слова, используемые в Паскале, поскольку в них нет строгой необходимости, либо же эти слова заменены одиноч- ными знаками пунктуации, например begin на литеру «{». Ис- пользование инструкции for в приведенных примерах подчерки- вает эту разницу: На Паскале: for k := 1 to n do begin (здесь выделены только зарезервированные слова). На языке С: for (k=l; k <= n; k+4-)
Гл. 12. Программирование 231 Подробный анализ программы на языке С Теперь мы кратко разберем назначение каждой строки в нашем примере программы на языке С. Первая строка — это комментарий, и поэтому, собственно, программа начинается со следующей строки. Инструкция include вставляет в программу встроенный набор описаний из файла stdio.h (этот файл расположен в одном из системных каталогов UNIX). Содержимое этого файла на данном этапе не представляет интереса, но само его использование иллюстрирует два важных принципа. Во-первых, стандартный метод построения программ на языке С — это построение программ из небольших отдельных модулей в соответствии с философией «чем меньше, тем лучше». Инструкция include — одна из составных частей механизма, который помогает реализовать эту философию. Второй момент, иллюстрируемый строкой, содержащей include,— это гибкость языка С. Средства ввода-вывода в языке С не встроены в язык, а реализованы через отдельные модули, которые пользователь может объединять со своей программой. Поэтому вы свободны применять любые средства ввода-вывода, какие пожелаете. Есть, однако, стандартный модуль, который можно использовать в случае, когда к вводу-выводу не предъявляется никаких необыч- ных требований. Этот модуль вызывается посредством включе- ния файла stdio. h (как в нашем примере). В противоположность этому гибкому подходу многие языки программирования имеют встроенные средства ввода-вывода, и если эти средства не удов- летворяют вашим потребностям, то тем хуже для вас. Следующая строка программы на языке С main () объявляет о начале главной функции в программе. (Понятие функции в языке С не только соответствует понятию вызывае- мой функции в других языках, но также включает понятие под- программы или процедуры.) Обычно программа на языке С сос- тоит из главной функции main и большого числа дополнительных функций, но наша простейшая программа состоит только из функции main. Тело функции main заключено в скобки «{» и «}». Следующие две строки содержат описания переменных, яв- ляющихся локальными по отношению к функции main. В языке С, как и в Паскале, переменным могут быть присвоены любые имена (в пределах определенных ограничений), и вам необходимо указать заранее, какие имена вы будете использовать. Еще более важно то, что вы должны указать тип данных для каждой переменной, т. е. вид значений, которые она может принимать. Когда мы задаем описание
232 Часть II. Приложение идей int п, к; мы говорим, что и и k — это имена переменных, значениями ко- торых являются целые числа (integers). Описание float sum, number; объявляет, что sum и number — это имена переменных, значе- ниями которых являются числа с плавающей точкой (floating -point) (числа, которые могут содержать дробную часть). Типы данных и структуры данных — один из ключевых узлов языка программирования, и язык С предлагает в этом плане большое разнообразие, на которое в нашей простой программе делается только намек. Оставшаяся часть программы состоит из инструкций, кото- рые необходимо выполнить для вычисления среднего. Инструк- ции scanf и printf осуществляют соответственно ввод и вывод. Первый аргумент в каждой из них задает формат вводимых или выводимых данных. Не вдаваясь в детали, отметим, что %d означает формат десятичного целого, %f означает формат с плавающей точкой, а \п — начало новой строки. (Применение знака процента и обратной косой черты может напомнить читате- лю об «удовольствиях» использования металитер.) Наконец, интерес в приведенном нами простом примере про- граммы на языке С представляют две инструкции к+ + sum += number; Первая увеличивает k на единицу (и если эта инструкция исполь- зуется в контексте, где необходимо значение, например в ка- честве индекса массива, дает новое значение k). Вторая ин- струкция увеличивает sum на значение number. Назначение этих двух сокращенных обозначений — частично сэкономить запись, а также, что более важно, повысить скорость выполнения программы. Многие ЭВМ имеют специальные инструкции или специальные «автоинкрементные» регистры, которые могут быть использованы для приращения переменных. Нотация языка С облегчает использование таких средств. Это служит небольшой иллюстрацией общего свойства языка С: поскольку С первона- чально использовался для реализации самой системы UNIX (и еще выполняет эту роль), было очень важно, чтобы каждое средство языка допускало быструю и эффективную реализацию. На языке С вы можете... Язык С пользуется популярностью у программистов. По нашей тривиальной программе нельзя понять основную причину этой популярности. Этой причиной является универсальность языка С:
Гл. 12. Программирование 233 что бы вам ни понадобилось сделать, вы можете это сделать на языке С. Это контрастирует с языками, в которых вы можете делать только те вещи, которые имели в виду разработчики этих языков, причем вы обязаны при этом точно соблюдать пра- вила. Используя С, вы можете чувствовать себя полновластным хозяином, а не младшим членом строгой религиозной секты. Этот момент хорошо подмечен Керниганом (Kernighan, 1981) при сравнении языков С и Паскаль. По мнению Кернигана, схватка была недолгой: С выиграл все раунды с большим пре- имуществом. Нокаутирующим ударом в последнем раунде оказа- лось то, что в Паскале нет способа обойти правило: правила в Паскале жестко навязываются. В языке С же, с другой стороны, если вам не нравится правило, то обычно у вас имеются средства для отмены его действия, а если вам не нравится компонента вашего окружения, вы можете заменить ее. Без сомнения, у вас будет свое собственное мнение на счет того, приводит ли к удаче и счастью в жизни следование ряду строгих правил. В соответствии со своей философией вы можете выбрать свой язык программирования. Чтобы помочь вам сде- лать выбор, можем порекомендовать статью (Feuer, Gehani, 1982), в которой борьба С и Паскаля освещается с точки зрения двух болельщиков, находящихся по другую сторону ринга. Если вы хотите почитать полный и всесторонний отчет о языке С, следует взять книгу Кернигана и Ритчи (Kernighan, Ritchie, 1978). Первоначально С был доступен на одной ЭВМ, а именно PDP-11; теперь он доступен не только на всех ЭВМ, на которых работает UNIX, но также на некоторых из тех ЭВМ, на которых используются другие операционные системы. Наша книга имеет отношение ко всем этим реализациям. Системные функции Большинство средств, встроенных в саму систему UNIX, можно вызывать из программ, написанных на языке С. Это осуществля- ется с помощью обращения к системным функциям. Список име- ющихся в наличии системных функций приведен в разделе 2 вашего Руководства для программиста системы UNIX. Приме- ром системной функции является функция chmod, которая по- зволяет программе изменять полномочия файла. Эта функция соответствует команде chmod в UNIX, которая на самом деле реа- лизована с использованием обращения к системной функции chmod. Использование системных функций — одна из причин, по- чему вы обязательно должны изучить С, если стремитесь стать системным программистом UNIX. Хотя вы можете создавать в
234 Часть II. Приложение идей UNIX новые команды, используя программы оболочки и другие подобные средства, существуют определенные возможности, которые лучше всего достигаются посредством написания про- грамм на языке С, содержащих обращения к системным функ- циям. Выполнение программы Мы закончили краткое обсуждение языков программирования и введение в язык С. Оставшаяся часть главы посвящена объяс- нению методики подготовки и выполнения программ. Наша цель — нарисовать широкую картину имеющихся возможно- стей, так как подробные объяснения привели бы к длинным разде- лам, интересным только узкому кругу читателей. Поэтому про- сим извинить за дежурную фразу: конкретные детали реали- зации смотрите в документации по своей системе. Для большинства языков программирования требуется пре- образование первоначальной исходной программы в эквивалент- ную двоичную форму, которую ЭВМ может выполнить. Эта форма называется выполнимой программой. Когда выполнимая программа запоминается в некотором файле, имя этого файла можно использовать в качестве команды UNIX. Так, встроенные команды UNIX (cat, Is и т. д.), как уже разъяснялось выше, соответствуют выполнимым программам, хранящимся в файлах где-то в нашем маршруте поиска. Алгоритм создания и выполнения своей собственной програм- мы следующий: (1) подготовьте исходную программу в файле; (2) вызовите командой UNIX языковый процессор, соответст- вующий используемому языку программирования, чтобы создать из исходной программы выполнимую программу. Мы называем это компиляцией вашей программы (хотя, стро- го говоря, языковым процессором может иногда оказаться интерпретатор, а не компилятор); (3) если языковый процессор обнаружил какие-либо ошибки в вашей исходной программе, отредактируйте ее и скомпили- руйте заново; (4) выполните свою выполнимую программу. Единственными языками программирования, которые не вписы- ваются в приведенную выше схему, являются интерактивные языки, такие как Бейсик. Языковый процессор для языка С называется сс. Команда UNIX для компиляции программы на С имеет вид сс файл ...
Гл. 12. Программирование 235 Для программ на языке Фортран 77 команда для компиляции за- писывается в виде f 77 файл ... (естественно, в предположении, что f77 входит в состав вашей системы UNIX). Выполнимая программа Большинство языковых процессоров создают выполнимую про- грамму в файле, который по умолчанию называется a.out и находится внутри текущего каталога. Полномочия, устанавли- ваемые для выполнимой программы, естественно, включают раз- решение на выполнение — иначе вы не смогли бы выполнить эту программу. Чтобы выполнить программу a.out, вы просто пользуетесь командой a. out Большинство программ, включая приведенные выше приме- ры программы получения среднего значения, пишутся с учетом использования стандартного ввода и вывода, а не для работы с конкретными файлами. Для того чтобы ввести данные из задан- ного файла, а не из стандартного ввода, вы можете использовать средства переадресации, представляемые оболочкой. Так, если a.out содержит программу получения среднего значения и мы хотим применить ее к данным из файла mydata, то можно просто использовать команду a.out <mydata Аналогично, если мы хотим послать результаты в файл, а не на терминал, то используем команду a.out >afile Вот более сложный пример с переадресацией и ввода, и вывода: a.out </usr/friend/data >subdirectory/answers Третий сеанс из приложения А содержит полный пример компиляции и выполнения программы. Сохранение выполнимой программы Возможны три результата пробного использования программы a.out, которую вы только что создали: • ваша программа не делает то, что должна делать. В этом случае вам придется исправить исходную программу и повтор-
236 Часть II. Приложение идей но ее скомпилировать. Затем вы получите новую выполнимую программу a.out и можете ее испробовать; • ваша программа выполнилась правильно, и она вам больше не нужна. В этом случае вы можете уничтожать файл a.out, а также свою первоначальную исходную программу; • ваша программа выполняется правильно, и вы хотите сохра- нить ее для дальнейшего использования. Теперь мы обсудим третью возможность. Если программа небольшая, нет необходимости хранить файл a.out. Вы можете просто заново скомпилировать исходную программу, когда возникает необходимость в ее использовании. С другой стороны, если программа большая и регулярно исполь- зуется, целесообразно сохранить файл a.out, чтобы сохранить время на повторную компиляцию программы. Чтобы это сде- лать, следует выбрать подходящее имя файла, скажем average (среднее) и набрать команду mv a.out average Таким путем файл a.out переименовывается в average (предыду- щая версия average, если таковая была, разрушается). Иногда желательно переслать файл a.out в командный каталог bin, как описано в гл. 7. Можно, конечно, просто оставить выполнимую программу в файле a.out, но это имеет два потенциальных недостатка: • вы можете начать работать с некоторыми другими програм- мами и затем породить новый файл a.out, который затрет предыдущий; • некоторые административные программы UNIX считают файлы a.out временными и периодически автоматически уни- чтожают их (например, каждое воскресенье, в полночь), чтобы высвободить память. На практике только очень небольшое число файлов a.out со- храняется и повторно используется. К сожалению, большинство программ a.out выполняются один раз, а затем уничтожаются обычно потому, что они не работают. Основная причина, почему UNIX использует фиксированное имя a.out, кроется именно в том, что по умолчанию выполнимые программы являются объек- тами, которые можно затереть или уничтожить. Однако некото- рые программы выживают: большинство встроенных программ UNIX на некоторых этапах своей разработки были файлами a. out. Подчеркнем, что файлы a.out не имеют никаких особых свойств. Они являются просто двоичными файлами с разреше- нием на выполнение. Это контрастирует с некоторыми опера-
Гл. 12. Программирование 237 ционными системами, которые поддерживают специальные «ра- бочие» файлы. Учитывая, что в имени a.out нет ничего магиче- ского, некоторые языковые процессоры используют другие подра- зумеваемые имена, например obj. Раздельная компиляция модулей философия UNIX состоит в том, что большие программы, где это возможно, должны быть разбиты на меньшие программы. Некоторые из этих «меньших» программ тем не менее все же яв- ляются большими — примером такой программы служит nroff — и на их компиляцию требуется длительное время. Такие про- граммы необходимо делить на отдельные единицы, которые мы называем модулями. Использование отдельных модулей ценно даже для небольших программ; например, наша программа на С была объединена с отдельно и заранее написанным модулем ввода-вывода. Хорошая компилирующая система должна до- пускать раздельную компиляцию модулей, так что, если один модуль изменяется, необходимо вновь скомпилировать только этот модуль, а не всю программу. Многие языки программирова- ния имеют в UNIX хорошие компилирующие системы. Используется принцип преобразования модуля в так назы- ваемую объектную форму, которую впоследствии можно за- помнить в файле (объектном файле). Объектный файл — это двоичный файл, весьма близкий по формату к конечной выпол- нимой программе. Программа UNIX, называемая загрузчиком (или редактором связей), преобразует объектные файлы в их ко- нечную выполнимую форму. Большое достоинство загрузчика состоит в том, что он может объединять вместе несколько объект- ных файлов для построения одной выполнимой программы. Большую программу можно компилировать следующим образом: (1) скомпилировать каждый модуль в объектный файл; (2) использовать загрузчик для объединения объектных файлов всех модулей и создания выполнимой программы; затем вы- полнить эту программу; (3) если в каком-либо модуле оказалась ошибка, исправить исходный файл для этого модуля и повторно скомпилировать его в новый объектный файл; затем перейти вновь к шагу (2). Поскольку процесс загрузки выполняется намного быстрее, чем повторная компиляция, приведенный выше метод обеспечивает удобный способ работы с большими модульными программами. Подробности работы загрузчика необходимо знать только специалистам. Большинство же может не знать даже его имени (Id), так как языковые процессоры обычно вызывают загрузчик автоматически.
238 Часть И. Приложение идей Расширения Потенциальным недостатком вышеприведенного метода являет- ся работа с несколькими формами программ: • исходным файлом для каждого модуля; • объектным файлом для каждого модуля; • выполнимой программой. Это создает два неудобства. Во-первых, требуется большое файловое пространство; проблема может быть решена только безжалостным уничтожением объектных файлов и выполнимых программ, хранение которых не оправдано. Во-вторых, сущест- вует проблема именования всех этих файлов. UNIX изящно ре- шает эту проблему с помощью расширений имен файлов. В гл. 7, где рассматривалось понятие расширений, мы приводили сле- дующие примеры: average.р программа на Паскале; average.c программа на языке С; average.spec спецификация программы. Приведем еще два примера: average.о объектный файл программы; average выполнимый файл программы. Такие расширения, указывающие природу файла, использу- ются языковыми процессорами, и от вас, как мы вскоре увидим, также требуется соблюдение некоторых из этих соглашений. Компиляция многомодульных программ Средства, предоставляемые большинством языковых процессоров системы UNIX для компиляции многомодульных программ, настолько изящны и просты, что едва ли вам нужно знать, что представляют собой объектные файлы. Мы проиллюстрируем это на примере компиляции программы на языке С, состоящей из трех модулей: modulel.c, module2.c и module3.c. Чтобы скомпилировать эту программу, вначале выполняет- ся команда сс modulel.c module2.c module3.c или ее эквивалент, в котором используется металитера «?» обо- лочки: сс module?.с Языковый процессор сс полагает, что если он компилирует более одного файла за раз, то он имеет дело с многомодульной програм-
1Л. 1Z. 1 ipVI puiu;u(i|7 мой и пользователю может понадобиться сохранить объектные файлы. Поэтому в нашем примере он автоматически создает объектный файл (с расширением .о) из каждого исходного файла (с расширением .с), который он компилирует. Таким образом, языковый процессор создает три объектных файла modulel.o, module2.o и module3.o. Он создает также обычным путем файл a.out. Если пользователь выполняет файл a.out и обнаруживает, что во втором модуле есть ошибка, то он проводит соответствую- щим образом необходимое исправление в module2.c. Ему не нужно повторно компилировать два других модуля, так как они не из- менялись. Поэтому пользователь повторно компилирует свою программу, используя команду сс modulel.o module2.c module3.o По этой команде повторно компилируется module2.c, в результате чего образуется новый объектный файл module2.o и затем вызы- вается загрузчик, который объединяет этот новый объектный файл с modulel.o и moduie3.o и получает новый файл a.out. В итоге компиляция проходит значительно быстрее, так как первый и третий модули повторно не компилируются. Весь процесс создания выполнимой программы из группы исходных модулей и вообще процесс создания файлов, которые зависят от других файлов, можно автоматизировать путем ис- пользования суперпрограммы UNIX под названием make. Прин- цип следующий: вы сообщаете программе make, как генерировать каждый файл, используя другие. Когда вы вызываете make, она просматривает времена создания и последнего изменения файлов. Если файл х зависит от файла у и файл у последний раз изменялся позднее файла х, то make заново сгенерирует файл х Вы можете задать свои инструкции для программы make путем создания файла с именем makefile в своем текущем каталоге, а затем просто набирать make Примером простого файла makefile, который компилирует нашу многомодульную программу, служит a.out: modulel.o module2.o modules.о cc modulel.o module2.o module3.o Первая строка, которую мы называем описанием зависимости, информирует, что a.out зависит от модулей modulel.o, module2.o и modules.о. Чтобы сгенерировать файл a.out, из этих файлов необходимо выполнить команду(ы), которая(ые) следует(ют) за строкой с описанием зависимости. Эти командные строки на- чинаются с литер табуляции, чтобы отличить их от строк, опи-
240 Часть II. Приложение идей сывающих зависимости. В нашем случае имеется только одна команда сс modulel.o module2.o module3.o Программа make сама знает, что каждый файл с расширением .о зависит от соответствующего файла с расширением .с. Она также знает, что если файл х.с изменялся позднее, чем файл х.о, то следует повторно скомпилировать первый файл, чтобы получить новую версию последнего. А поэтому нам не нужно говорить ей, что modulel.o зависит от модуля modulel.c и т. д. В общем слу- чае, однако, вы можете в одном и том же файле makefile иметь несколько описаний зависимости плюс связанные с ними команд- ные строки. Сфера использования команды make выходит далеко за преде- лы компиляции программ. Эта команда может быть использова- на, например, для создания книги из отдельных глав. Файлы makefile служат также ценными документами о взаимозависимос- тях файлов и могут даже заменить файлы README, предложен- ные нами в гл. 7. Языки и процессоры Языковый процессор сс имеет множество опций для управления процессом компиляции и генерации файлов, например вы можете послать результирующую выполнимую программу в файл, от- личный от a.out. Другие языковые процессоры имеют аналогич- ные опции. Более подробную информацию вы можете получить в документации по выбранному вами языковому процессору. Когда программа делится на раздельно компилируемые мо- дули, языки программирования предлагают определенные формы записи для ссылок из одного модуля в другой. Применяемый ме- тод целиком зависит от языка программирования; он часто вклю- чает такие понятия, как «внешний» (external) или «общий» (com- mon). К сожалению, большинство программистов тратят много време- ни на нахождение и исправление ошибок. Синтаксические ошибки при использовании языков программирования обычно исправить легко. Как правило, языковый процессор даже не будет гене- рировать выполняемый файл, если исходная программа синтак- сически неправильна. Для языка С имеется специальная вспо- могательная программа lint, которую можно использовать для анализа исходной С-программы, поиска ошибок и сомнительных мест, не обнаруживаемых командой сс. Наиболее трудные ошибки возникают, когда программа син- таксически правильна, но не делает то, что должна делать. Про- граммисты по-разному относятся к отладке. Некоторые верят,
Гл. 12. Программирование 241 что ничто не заменит работу мысли и эксперимент; другие же считают, что стоит использовать специальные отладочные сис- темы. Чтобы удовлетворить последних, система UNIX предла- гает семейство отладочных программ, соответствующих языкам, которые она поддерживает. Эти программы имеют такие имена, как adb и sdb; с ними можно ознакомиться по документации своей системы. Кроме того, для тех, кому доставляет удовольствие програм- мировать на языках низкого уровня, большинство систем UNIX поддерживает ассемблер as. Однако вы можете выполнить боль- шинство задач на С, не опускаясь на такую глубину. Библиотеки Для облегчения программирования система UNIX предоставляет библиотеки полезных функций. Более того, вы можете, если хотите, создавать свои собственные библиотеки, используя про- грамму с именем аг. Библиотеки снабжаются расширением .а, чтобы отличить их от других файлов. Достоинство библиотеки по сравнению с объектным файлом состоит в том, что загрузчик может выбирать из библиотеки необходимые вам функции, а не включать всю библиотеку в вашу выполнимую программу. Для таких библиотек в UNIX принят термин «архив» — отсюда в качестве расширения используется буква а. В разделе 3 вашего Руководства для программиста системы UNIX содержится список всех имеющихся встроенных библио- течных подпрограмм. Сюда входят функции из библиотеки stdio, о которой мы упоминали ранее, плюс многие другие. В основном они предназначены для использования из программ, написанных на С, но иногда могут использоваться также и в других языках программирования. Библиотека используется следующим образом. Вы помещае- те инструкцию include в свою программу, чтобы программа могла ссылаться на объекты из этой библиотеки. Таким образом вы сообщаете своей программе о спецификациях библиотеки, но надо еще дать указание компилятору связать библиотеку с вашей программой. Встроенные библиотеки UNIX хранятся в каталоге /НЬ или /usr/lib Опция компилятора —1х (это в действительности опция, реализуемая загрузчиком, а не компилятором) вызывает использование библиотечного файла libx.a из /lib или /usr/lib. Конкретный пример: если вы хотите воспользоваться встроенной библиотекой математических подпрограмм (синусом, функциями Бесселя и т. д.), вы включаете файл math.h в свою программу при помощи строки #include <math.h>
242 Часть II. Приложение идей Учитывая, что эта библиотека хранится в файле libm.a, вы задаете опцию —1m в команде сс при компиляции своей программы. Эту опцию необходимо поместить в конце команды сс, так как просмотр библиотеки должен происходить после компиляции программы — только тогда становится известно, какие библио- течные средства необходимы. Наконец, дадим общий совет, который относится не только к библиотекам, но и к большинству других средств UNIX; преж- де чем вы окунетесь в реализацию чего-либо, поройтесь в доку- ментации UNIX, чтобы узнать, что уже сделано. Многие про- граммисты тратят все свое время на изобретение велосипеда. Следование стилю UNIX При написании программ вы должны стараться следовать об- щему стилю UNIX, с тем чтобы ваши программы можно было лег- ко и естественно использовать. Помните, что почти все встроен- ные программы в системе UNIX написаны на С, поэтому С дает все необходимые средства, чтобы следовать общему стилю сис- темы. В частности, С представляет средства, позволяющие про- грамме анализировать командную строку, которая вызвала ее выполнение, например, a.out —х Это позволяет программе реализовать свои собственные опции. В приведенном выше случае она могла бы посмотреть, имеется ли аргумент, задающий опцию х, и, если он есть, соответственно на это отреагировать.. Другие языки, доступные в UNIX, могут располагать ана- логичными средствами, хотя бесспорно в С эти средства наиболее развиты. Резюме Подытожим результаты этой главы: • выберите язык программирования, который имеется в распоря- жении в вашей системе UNIX и удовлетворяет вашим по- требностям и жизненным привычкам; • изучите язык С, если у вас есть желание состязаться с Дадли; • разбивайте свои программы на отдельные модули и затем ис- пользуйте великолепные возможности UNIX для работы с объектными файлами; • старайтесь разрабатывать свои программы так, чтобы они имели такой же стиль и пользовательский интерфейс, как и встроенные программы UNIX, если только вы не являетесь настоящим противником этого стиля или считаете, что пользо- ватели вашей программы должны быть защищены от влия- ния отшл.
ГЛАВА 13 ЗАКЛЮЧИТЕЛЬНЫЙ ОБЗОР И не смог бы я сказать вам больше, Даже проповедью в целый год! Лонгфелло Цель этой заключительной главы — рассмотреть некоторые по- лезные команды, которые не нашлось случая осветить в преды- дущих главах. В конце главы мы подведем итоги о системе UNIX в целом. Устройства Прежде чем мы опишем какие-либо еще команды UNIX, необ- ходимо выполнить обещание, данное в гл. 5: подробнее объяснить средства связи с периферийными устройствами, которые могут быть подключены к вашей ЭВМ.
244 Часть II. Приложение идей В гл. 5 мы объясняли, что устройство может работать через механизм спулинга, так что несколько пользователей могут его использовать одновременно. Когда устройство работает через механизм спулинга, вы не взаимодействуете с ним непосред- ственно; вместо этого вы используете программу, которая вы- полняет спулинг — примером такой программы служит 1рг. На вашей ЭВМ может быть устройство, для которого спулинг невозможен или неуместен; вам необходимо будет взаимодейст- вовать с таким устройством непосредственно (а поэтому ни один из других пользователей не сможет в это же время использо- вать данное устройство). Непосредственное взаимодействие с уст- ройствами в системе UNIX осуществляется легко, так как уст- ройства в ней обрабатываются точно так нее, как если бы они были файлами. Каждое устройство представляется «именем фай- ла» вида /dev / имя-устройство Мы будем называть такие файлы файлами-устройствами. Если вы наберете команду Is /dev то получите полный список всех файлов-устройств, имеющихся в вашей системе UNIX. Назначение некоторых файлов-устройств будет понятно только специалистам, поскольку касается внут- ренней работы UNIX, но вы должны увидеть и несколько понят- ных вам имен. Всегда должно быть одно или несколько устройств вида ttyn, где п — некоторое число. Эти имена соответствуют терминалам, связанным с вашей системой; это те же самые имена, которые используются в выводе команд who и write. Команда tty сообщит вам имя файла-терминала, с которым вы работаете. Moi предположим, что это имя /dev/tty 11 Файлы-устройства UNIX привлекательны тем, что их можно использовать точно так же, как и настоящие файлы. Например, вы можете набрать cat at Не >/dev/tty 11 чтобы послать вывод на свой терминал. Эта команда, естественно, ничем не отличается от обычной команды cat, поскольку послед- няя также посылает вывод на ваш терминал. Однако другие пользователи могут набрать вышеприведенную команду и тем
Гл. 13. Заключительный обзор 245 самым переадресовать вывод cat на ваш терминал. На самом деле команда типа write me работает следующим образом: сначала она ищет те в таблице пользователей — в той же таблице, которую использует команда who, а затем переадресовывает вывод в файл-устройство, свя- занное с те, в данном случае в /dev/tty 1 1. Непосредственная запись на чужой терминал не принята среди цивилизованных людей, и настоящая ценность файлов- устройств проявляется, когда к вашей ЭВМ подключено не- сколько специальных устройств. Предположим, что таким уст- ройством служит чайник для заварки под именем /dev/teamaker. Прежде чем воспользоваться им, вам придется обратиться к Дадли и его друзьям с просьбой написать программы, которые будут им управлять, и поместить его имя в каталог /dev вашей, системы. Некоторые устройства, например печатающие устройст- ва, просто выводят текст, который в них засылается, но програм- мы Дадли для нашего заварочного чайника должны будут интер- претировать этот текст как команды. Предположим, что Дадли предусмотрел две команды spoons N (засыпать N ложек чая) boil (вскипятить воду) Заполучив эти операции, мы можем пожинать плоды напряжен- ных трудов Дадли, вводя $ cat >/dev/teamaker spoons 2 boil Затем можно идти и наслаждаться чаем. Выполнение команд в будущем Теперь мы опишем еще несколько команд UNIX. Начнем с за- мечательной команды at, которая позволяет управлять временем. Вы можете указать, чтобы заданная программа оболочки, храня- щаяся в файле, выполнилась в определенное время в будущем. Для этого вводится команда at время файл Время обычно задается последовательностью из четырех цифр, представляющей время по 24-часовой шкале. Так, 1430 означа- ет 2.30 пополудни. Существуют также более сложные способы
246 Часть II. Приложение идей спецификации времени, и вы можете наряду со временем дня за- дать также дату на несколько дней или месяцев вперед. Если вы не задаете дату, команда будет выполнена в течение следующих 24 часов. Файл, который мы называем at-файлом, должен быть именем файла, содержащего программу оболочки. Так как эта программа будет выполняться в будущем, когда вы, возможно, не будете работать в системе, эта программа оболочки не должна взаимо- действовать с вашим терминалом. Поэтому она не должна ис- пользовать стандартный ввод или вывод (или стандартный вывод диагностики). Команда at полезна в сильно загруженных системах разделе- ния времени, в которых большие программы лучше всего вы- полнять ночью. Она полезна также для выполнения функций администрирования, например для корректировки таблиц или чистки файловой системы, которые также лучше всего проводить по ночам, когда система не очень загружена. (Суперпользова- тель, которая осуществляет функции администратора системы, обычно может использовать свое собственное специальное средст- во — cron,— которое еще более мощное, чем at.) At-файл сам может содержать команду at, и таким образом команды at могут себя увековечить. Задание, однажды запущен- ное в три часа утра, может поэтому само породить подобное зада- ние, которое будет выполняться в три часа утра на следующий день, а то в свою очередь может породить следующее задание. Таким образом реализуются ежедневные работы. Некоторые системы UNIX допускают для команды at оп- цию —т. Эта опция вызывает отправку вам почты с подтвержде- нием того, что команда at действительно была выполнена. Эта опция практически является составной частью стиля UNIX; другие команды, аналогичные по природе команде at, могут иметь такую же опцию; ее назначение — уведомить пользова- теля о том, что то, что он хотел, действительно случилось. В качестве примера использования at предположим, что файл checknovel содержит две строки checknr chapter* >nrofferror spell chapter* >spelterror которые ищут ошибки в конструкциях nroff и ошибки правопи- сания во всех главах книги и посылают результаты в два фай- ла — nrofferror и spellerror. Файл checknovel можно выполнить в три часа утра командой at 0300 checknovel При выполнении at в качестве текущего будет использоваться тот же каталог, который является текущим каталогом сейчас,
Гл. 13. Заключительный обзор 247 поэтому мы предполагаем, что все файлы chapter находятся в этом каталоге. Близко к команде at стоит команда sleep. Команда sleep п заставляет процесс «заснуть» на п секунд. Так, если ваша про- грамма оболочки состоит из двух команд sleep 600 echo Wake up то выполнение этой программы приведет к выводу слов «Wake up» («Пробуждение») через 10 минут (600 секунд). Такая про- грамма оболочки может выполняться как фоновая, пока в рам- ках основного процесса вы читаете один из файлов Дадли, кото- рый содержит описание его программных трюков. Сравнение файлов В UNIX имеется несколько команд для сравнения файлов. Команда diff, возможно, используется наиболее часто. Diff срав- нивает два файла и идентифицирует все строки, которыми они отличаются. Она осуществляет свой вывод в виде, подобном (но не идентичном) последовательности команд ed, которую надо выполнить для создания одного файла из другого. Поэтому, если вы хорошо владеете редактором ed, то скоро станете также хорошим специалистом по распутыванию вывода команды diff. Рассмотрим команду diff fl f2 где файл f2 идентичен fl, за исключением того, что • новая строка, содержащая текст «Вы должны мне тысячу фун- тов», добавлена после строки 122. • строка 100, содержащая текст «Я должен вам 50 фунтов», удалена из файла f2. Вывод команды diff имеет вид 100d99 < Я должен вам 50 фунтов 122а122 > Вы должны мне тысячу фунтов Число 99 после d в первой строке и число 122 после а в третьей строке являются в действительности номерами строк файла f3. Если вы и в самом деле хотите отредактировать fl так, чтобы получить f2, то представьте себе, что этих номеров нет. Знаки
248 Часть II. Приложение идей <и> указывают строки, содержащиеся в fl, но отсутствующие в f2, и наоборот. Таким образом, вывод команды diff в двух местах является расширением обычной нотации редактора ed. Цель этих расши- рений — обеспечить дополнительную информацию, которая мо- жет вам понадобиться. Однако, если вы действительно хотите, чтобы вывод команды diff состоял из настоящих команд редактора ed, а не был приближением к ним, следует использовать опцию —е. В нашем примере diff —е fl f2 порождает вывод 122а Вы должны мне тысячу фунтов 100d Обратите внимание, что команды редактирования идут в порядке уменьшения номеров строк, так что более ранние изменения не приводят к нарушению номеров последующих строк. Иногда, когда у вас имеются два похожих файла, вы можете с выгодой удалить один из них и пользоваться программой для редактора, такой как приведенная выше, чтобы вновь его создать из второго файла, когда в этом возникнет необходимость. Другой командой для сравнения файлов является comm. Команда comm предназначена для работы с файлами, которые уже отсортированы в алфавитном порядке (например, коман- дой sort). Примером может быть список ошибочных слов, порож- денный командой spell — в действительности spell использует sort для сортировки своего вывода. Синтаксис команды comm следующий: comm [—[123]] файл! файл2 Команда comm сравнивает файл1 с файл2 и порождает вывод в три колонки Колонка 1: строки, содержащиеся в файл1, но отсутст- вующие в файл2 Колонка 2: строки, содержащиеся в файл2, но отсутст- вующие в файл1 Колонка 3: строки, которые содержатся в обоих файлах Опции указывают колонки, вывод которых вы хотели бы пода- вить, например —3 подавляет колонку 3. В качестве примера использования comm предположим, что вы применяете UNIX для хранения коммерческих счетов и име- ете два файла
Гл. 13. Заключительный обзор 249 janlate должники за январь feblate должники за февраль Предположим, что эти файлы отсортированы в алфавитном по- рядке; тогда команда comm —12 janlate feblate выведет третью колонку команды comm, т. е. имена тех, кто за- должал и за январь и за февраль. (Название comm (common — общий) наводит именно на такой способ использования: на- хождение общих строк файлов.) Команды UNIX для сравнения файлов служат хорошей ил- люстрацией ценности материала, расположенного под заго- ловком «SEE ALSO» («СМ. ТАКЖЕ») в руководстве по системе UNIX. Если вы наберете man comm чтобы получить информацию о команде comm, то последними строками вывода будут SEE ALSO cmp(l), diff(l), uniq(l) Это означает, что если от comm вы получили недостаточно ин- формации, то вам следует заглянуть в страницы руководства по стр (команда, которая обнаруживает отличие с точностью до номера строки и номера байта в ней), diff и uniq — все эти команды описаны в разделе 1 Руководства для пользователя сис- темы UNIX. Использование файлового пространства Мы подчеркивали, что рано или поздно вы начнете испытывать недостаток в файловом пространстве. Чтобы облегчить контроль за своей жадностью, можно использовать команду du. Она сооб- щает, сколько «блоков» дисковой памяти занято под текущий ка- талог и каждый из его подкаталогов. Размер блока обычно сос- тавляет 512 байтов (литер). Чтобы получить общую картину использования вами прост- ранства на диске, наберите du, находясь в личном каталоге. Приучитесь набирать эту команду всякий раз при входе в систе-
250 Часть II. Приложение идей му и следите за тем, как размер занятого вами пространства не- уклонно ползет вверх. Вы можете даже включить команду du в свой входной файл .profile, так что вы будете автоматически информироваться об использовании файлового пространства при входе в систему. Изменение пароля Вы можете изменить свой пароль в любое время, используя команду passwd. Когда вы впервые используете UNIX, одним из первых ваших действий может быть установка нового пароля. Команда passwd понимает слабости человеческой натуры и пы- тается уберечь вас от их проявления. В частности, она пытается защитить вас от кражи, неосторожности и забывчивости. Предположим, что вас оторвали от терминала по срочному делу (см. /dev/teamaker выше) и вы оставили свой терминал в системе. Пока вы отсутствуете, какой-нибудь злоумышленник может подойти к терминалу и изменить ваш пароль; таким обра- зом он получит контроль над всем вашим хозяйством на ЭВМ. Команда passwd предохраняет против этого, требуя от каждого, кто изменяет пароль, подтвердить старый пароль. Она борется с неосторожностью и забывчивостью, требуя от вас повторить свой новый пароль дважды. Это помогает вам запомнить его и защищает от ситуации, когда вследствие опечат- ки при наборе нового пароля вы не знаете, каким он стал. Более того, passwd уберегает вас от проявления другой человеческой слабости — лени. Она требует чтобы вы в целях обеспечения надежности своей собственной защиты набрали пароль длиной как минимум 6 знаков. Однако, если вы настойчиво пытаетесь установить все тот же короткий пароль или если ваш пароль является смесью букв и других литер, команда в конечном счете ослабляет это ограничение. Следующий пример показывает образец использования passwd: $ passwd Изменения пароля для те Старый пароль: cleverme Новый пароль: genius Подтвердите новый пароль: genius $ (Хотя мы показали здесь пароли, они на самом деле не появля- ются на экране дисплея для всеобщего обозрения. Их вывод подавляется точно так же, как и при входе в систему.)
Гл. 13. Заключительный обзор 251 Семь смертных грехов Раз команда passwd отбивает охоту у вас — к лености в процессе набора паролей, а у других — к алчности до вашего пароля, а команда du контролирует ваше чревоугодие по отношению к файловому пространству, UNIX тем самым охватывает три из семи смертных грехов посредством всего лишь двух команд. Хотя вы можете поспорить, что diff с ее явно замысловатым вы- водом скорее вызывает гнев, чем обуздывает его, но по крайней мере у вас есть команда man, которая может смягчить этот гнев. Зависть можно обуздать, запретив читать файлы: если глаз не видит, то сердце не горюет; тот, кто излишне горд, становится скромным после первой попытки поработать с ed или nroff. Нет только программ, чтобы обуздать похоть. Страничная печать Мы видели, что команда cat выводит файлы в точности в том виде, какой они имеют, и что nroff можно использовать для формати- рования файлов, чтобы они действительно хорошо выглядели. Команда pr (print — печать) находится в промежутке между этими двумя командами. Ее основная функция состоит в деле- нии файла на страницы стандартного размера с добавлением в начало каждой страницы заголовка и ее номера. Как следует из ее названия, рг особенно полезна для печати файлов, а не для вывода их на экран дисплея. Если мы применим команду рг к началу нашего романа о Греге Деймлере, которое хранится в файле chapterl, то ее вывод будет выглядеть следующим образом: Дек 18 11:56 1983 chapterl стр 1 Грег Деймлер вошел в комнату. На полу валялось десять трупов. Он кашлянул. Один труп свалился с книжного шкафа. Грег посмотрел вверх. Он увидел еще семь трупов, пригвожденных к потолку. У трактора во дворе заглох двигатель. Часы пробили три. В этот момент открылась дверь. В комнату вошла высокая и потрясающе красивая девушка. На ней было короткое и очень узкое платье. Как видите, в заголовке страницы содержатся текущие дата и время, имя файла и номер страницы. Каждая страница имеет
252 Часть II. Приложение идей аналогичный заголовок, только номера страниц, естественно, отличаются от страницы к странице. Кроме создания заголовков страниц, рг добавляет пустые строки в конце страниц. У рг имеется множество опций, которые дают вам возможность управ- лять точным форматом заголовков и размерами строк и страниц. Если вы зададите опцию —2, то печать будет выполняться в две колонки; опция —3 вызывает 3-колонный вывод и т. д. Это удобно для печати в компактном виде файлов, состоящих из коротких строк. Если вы используете команду вида рг fl f2 f3 то, согласно обычному стилю UNIX, рг распечатает каждый из трех файлов по очереди. Управление терминалом В гл. 5 при обсуждении терминалов мы ссылались на команду stty; ее можно использовать для задания опций, связанных с вашим терминалом. Если вы наберете stty саму по себе, то увидите, каковы текущие установки опций. (В некоторых версиях UNIX вам может потребоваться набрать stty all или stty everything.) Примером использования команды stty может служить stty —echo которая подавляет эхо: литеры, которые вы набираете на кла- виатуре терминала, более не высвечиваются на экране дисплея. Для восстановления эха следует набрать stty echo Этот пример демонстрирует типичный синтаксис команды stty, который отличается от синтаксиса большинства других команд UNIX. Поскольку stty не имеет имен файлов в качест- ве своих аргументов, обычные правила, принятые для опций, ослаблены. Опции представляются, вопреки желанию отшл, длин- ными словами, такими как echo, а не отдельными буквами. Если названию опции предшествует знак минус, то опция выключает- ся, а если не предшествует, то опция включается. Дополнительно к опциям включения (выключения), таким как echo, команда stty имеет некоторые опции, в которые входит установка числа или литеры, связанных с терминалом. Примером этого служит команда stty erase =s
Гл. 13. Заключительный обзор 253 Эта команда назначает знак равенства клавишей стирания, т. е. клавишей, которую вы нажимаете, когда хотите удалить только что набранную ошибочную литеру. После такого использования stty, если вы наберете Дэ = еймлер то это будет воспринято как «Деймлер». Таким образом, знак равенства заменяет предыдущую клавишу стирания, скажем клавишу «#», и если вы теперь нажмете на клавишу «#», то она будет воспринята как обычная литера. У команды stty имеется масса опций, но большинство поль- зователей довольствуется ограниченным способом использова- ния своего терминала и поэтому нуждаются в команде stty только при смене терминала. Если вы проанализируете вывод команды stty самой по себе, который, как мы говорили, содержит текущие установки опций, то вы получите некоторое представ- ление о диапазоне возможных опций. Вот пример такого вывода: $ stty speed 9600 baud erase kill — even odd —raw —nl echo —lease —tabs ebreak width 132 length 24 Игры Для некоторых пользователей ЭВМ — это средство для игр; как побочный продукт она может также делать некоторые полез- ные вещи. Большое число компьютерных игр написаны для UNIX: эти игры охватывают диапазон от сложнейших программ игры в шахматы до игр, рассчитанных на фантазию и воображе- ние. В системах UNIX, работающих в режиме разделения вре- мени, администрация может пытаться подавлять игры — хотя часто конечным результатом таких ограничений является уве- личение количества игр. Если вы обратитесь к разделу 6 Руко- водства для программиста системы UNIX, то найдете, какие игры официально доступны в вашей системе UNIX. Как посмотреть на конец файла Часто полезно иметь возможность взглянуть на несколько послед- них строк файла, например, для того, чтобы узнать, как далеко кто-либо продвинулся с отчетным файлом. Это можно сделать, используя редактор — особенно его команду р,— но легче вос- пользоваться командой tail файл
254 Часть II. Приложение идей Эта команда выводит на экран несколько последних строк ука- занного файла. Tail имеет опции, позволяющие дополнительно управлять строками, которые выводятся на дисплей, вплоть до того, что она может выводить файлы даже целиком. Некоторые версии UNIX предоставляют команду head, которая противопо- ложна команде tail11. Если вы хотите узнать, какого рода данные содержат файл, то можете воспользоваться командой file. Эта команда анализи- рует заданный файл и пытается сделать разумное предположение о том, что он содержит, например, программу на языке С или входные данные для команды nroff. Подсчет Команда wc [файл] ... дает три вида статистики об указанных файлах: число строк, число слов и число литер. Примером ее использования может служить $ wc report 481 3517 20796 report В данном случае файл report содержит 481 строку, 3517 слов и 20 796 литер. Команда wc особенно полезна в качестве компонен- ты конвейера, например, $ who | wc 9 45 270 Команда who выводит имена всех текущих пользователей, по одному на строке. Поэтому количество строк, выданных коман- дой who, в данном случае 9, равно количеству пользователей. Два других числа, 45 и 270, в данном случае не несут полезной информации. Их можно подавить опцией —1, означающей «под- счет только строк», например, who | wc —1 Опции —w (для подсчета слов) и —с (для подсчета литер) имеют аналогичное назначение, что и опция —1. Версии UNIX В этой главе, как и в предыдущих, мы пытались описать средства, общие для всех реализаций UNIX, но делали попутные замеча- ния о средствах, которые различны в разных реализациях. Мы О Head означает голову, a tail — хвост.— Прим. ред.
Гл. 13. Заключительный обзор 255 завершаем главу дополнительной информацией о различных версиях UNIX. Система UNIX, подобно любому удачному про- дукту, подвергается постоянному развитию и усовершенство- ванию. Парадоксально, что самыми лучшими усовершенствова- ниями программных средств являются те, о которых пользователи не знают. Примерами таких усовершенствований — мы будем называть их эволюционными усовершенствованиями — могут быть • повышение эффективности существующей команды; о новая команда; е улучшенная команда, которая предоставляет все ранее из- вестные опции, а также некоторые новые опции. Наихудшими усовершенствованиями являются революционные усовершенствования, при которых некоторые существующие воз- можности исчезают и заменяются некоторыми новыми, отличными от них возможностями. В этом случае пользователи обнаружива- ют, что некоторые их приемы, возможно, оттачиваемые в тече- ние ряда лет, больше не работают. Поэтому коль скоро такие «усовершенствования» должны осчастливить пользователя, им следует быть поистине блистательными. К счастью, большинство усовершенствований UNIX, прово- дившихся в течение ряда лет, относятся к эволюционным. Вот почему можно писать книги о системе UNIX вообще, а не об од- ной конкретной реализации. Разработка системы UNIX началась в Bell Laboratories в 1969 г. и базировалась в основном на ЭВМ PDP-11. Вплоть до 1975 г., когда появилась так называемая шестая редакция сис- темы, UNIX не была широко доступна за пределами Bell Labo- ratories. На этом этапе в Bell Laboratories велись работы с целью сделать UNIX мобильной, т. е. способной работать на ЭВМ, отличных от PDP-11. Эта задача была успешно решена в основ- ном потому, что UNIX почти целиком была написана на языке С; как только на новой ЭВМ реализовывался С, за ним могла после- довать UNIX. Таким образом, UNIX была реализована на боль- шом числе различных ЭВМ и стала общедоступной системой. Кроме этой работы по мобильности, проводилась работа по со- вершенствованию самой системы UNIX, и конечным продуктом стала седьмая редакция системы UNIX — весьма успешная вер- сия, общеизвестная как «версия семь» или «V7». В этот момент развитие UNIX получило новый импульс: Калифорнийский университет в Беркли приступил к реализа- ции системы UNIX для ЭВМ VAX. Его работы вызвали такой же бурный восторг пользователей, как и работы самой Bell Labora- tories, система «UNIX Беркли» и ее новые возможности стали ши- роко известными. UNIX Беркли тоже выпускалась последова- тельными версиями: они имеют номера типа 4.1BSD и 4.2BSD.
256 Часть II. Приложение идей Bell Laboratories также развивала UNIX. После версии 7 стала использоваться другая нумерация версий. Вместо версии 8 появились версии System III, System V и т. д. Если вы находите все это слишком запутанным, забудьте об этом. Так же как вы можете водить автомобиль, не зная его конкретной модели, точно так же вы можете использовать свою UNIX и получать удовлетворение от работы с ней, не зная номера ее версии и ее происхождения. В документации по вашей системе описаны возможности, которые вам предоставляются; лучше быть благодарным за то, что есть, чем завидовать тем, кто хва- стается, что имеет более позднюю версию, чем ваша. Резюме Мы завершаем книгу мыслью, высказанной вначале: что более важны идеи, чем детали. Ясно, что вам придется изучить доста- точное количество деталей, чтобы использовать необходимый вам набор команд, но вы только тогда овладеете реальной мощью LJNIX, когда овладеете ее идеями. В частности, вам следует • организовывать свои файлы в иерархию отдельных каталогов не более чем по дюжине или около этого файлов в каждом каталоге; @ использовать средства UNIX для создания документов, даже если основной целью использования вами системы UNIX не является сочинение бумаг. Любой проект бесполезен без хорошей документации; е использовать конвейеры для создания нужных вам команд из других команд; • там, где конвейеры не подходят, создавать свои собственные команды путем написания программ оболочки; • использовать разработки других: прежде, чем вы начнете делать некоторую работу самостоятельно, просмотрите фай- ловую систему, чтобы узнать, какие средства, могущие по- мочь вам, уже существуют. Посмотрите, что вы' можете выгадать от работы других пользователей: свяжитесь со своими приятелями посредством электронной почты; • ни одно общество не может работать, пока не установится баланс между теми, кто дает, и теми, кто берет. Поэтому, если вы разрабатываете нечто, полезное всем, сделайте это нечто доступным для своих приятелей. Еще лучше сделать каждую отдельную часть своей работы доступной для исполь- зования другими, так чтобы они могли создавать что-либо для себя, используя ваши модули.
Гл. 13. Заключительный обзор 257 Все эти положения можно подытожить в одно: чтобы достичь чего-либо большого, нужно создавать маленькие и управляемые единицы и объединять их эффективным образом. Система UNIX имела успех потому, что обеспечила подходящее окружение для этого. Пользователи системы преуспели там, где они должным образом использовали это окружение. 9 № 181
ПРИЛОЖЕНИЕ А ПРИМЕРЫ СЕАНСОВ РАБОТЫ ЗА ТЕРМИНАЛОМ В этом приложении мы покажем некоторые примеры полных сеансов работы с UNIX. В каждом примере мы следуем нашему обычному соглашению: используем полужирный шрифт для вы- деления текста, набираемого пользователем. Сеанс 1: простейший пример использования почты В этом первом простейшем сеансе мы входим в систему и узнаем, что для нас есть какая-то электронная почта. Мы читаем свою почту, состоящую из единственного сообщения, которое пришло от пользователя по имени Билл (bill). Распечатав на экране со- общение от Билла, почтовая система запрашивает нас, что делать дальше. Мы уничтожаем сообщение, поскольку оно не заслужи- вает хранения и покидаем почтовую систему. Нашей следующей командой UNIX будет вновь использование почты на этот раз для ответа Биллу. Наконец, просто из любопытства, мы смотрим, кто в данный момент находится в системе, а затем выходим из системы. Поскольку Билл находится в системе, он должен сразу получить наше послание. login: me password: cleverme Для вас есть почта. $ mail От bill четв июл 1 12:51:36 Добро пожаловать в UNIX. Если вам будет нужна помощь, дайте мне знать. ? d ? ч $ mail bill Спасибо за ваше предложение. Я, возможно, обращусь к вам позже. набираем входное имя (пароль не отображается на экране) чтение почты удаление почтового сообще- ния выход из почтовой системы ответ Биллу
Приложение А. Примеры сеансов работы за терминалом 259 $ who bill me аппе dudley $ Ad ttyOl Jul 1 12:45 ttyll Jul 1 13:50 tty 13 Jul 1 13:22 ttyl5 Jul 1 03:20 завершение послания кто работает в системе выход из системы Сеанс 2: подготовка документа В этом примере мы используем редактор ed для подготовки до- кумента и помещения его в файл mynews. Наш документ будет обрабатываться форматором текстов nroff (с использованием мак- ропакета ms) и содержит запросы SH, LP и РР. Набрав документ, мы замечаем, что слово «сообщить» ока- залось написанным неверно, как «сообщинь». Поэтому мы отыс- киваем строку, содержащую это слово, и заменяем «сообщинь» на «сообщить». Затем записываем документ в файл mynews и выходим из редактора. (До этого места наш сеанс очень похож на примерный сеанс 1 в описании редактора ed в гл. 8; если вы хотите посмотреть другие примеры редактирования, вам следует обратиться к остальным примерным сеансам из гл. 8.) Создав файл mynews, мы применяем к нему проверку пра- вильности написания; программа spell отвечает молчанием, а это означает, что ошибки не обнаружены — она даже восприняла имена собственные, такие как «Мартин» и «Коллинз». Затем мы используем nroff для форматирования документа; результат выводится на терминал. В верхней части документа, так же как и в нижней, вставлено несколько пустых строк; внизу добавлена текущая дата. (Мы немножко смошенничали при отображении этого вывода: сделали строки и страницу короче, чтобы они помес- тились на странице книги.) Удовлетворенные результатом, мы снова выполняем nroff, на этот раз посылая результат ее работы на печатающее устройство. Эту вторую команду nroff мы вы- полняем как фоновую, поскольку нет необходимости взаимодей- ствовать с ней или ожидать ее завершения. Мы достигаем этого, набирая амперсанд в конце команды. Затем выходим из системы, оставляя эту команду выполняться саму по себе. В напечатанном документе заголовок раздела — слово «объявление» — должен быть выделен полужирным шрифтом. login: me ввод входного имени password: cleverme ввод пароля $ ed вход в редактор а добавление некоторого текста •SH \"заголовок раздела 9*
260 Приложение А. Примеры сеансов работы за терминалом Объявление .LP абзац, выравненный слева Я счастлив сообщинь о своей помолвке с Джейн, единственной дочерью майора и миссис А. Д. Коллинз, проживающей на Кафедрал авеню, 25, Кентербери. .РР\" абзац с отступом Свадьба состоится в церкви св. Мартина 3 ноября в 2 часа 30 минут дня. /сообщинь/ Я счастлив сообщинь о sZ/сообщить/р Я счастлив сообщить о w mynews 301 q $ spell mynews $ nroff —ms mynews завершение текста поиск «сообщинь» (результат поиска) замена и печать (исправленная строка) запись файла (размер файла) выход из редактора проверка правописания форматирование документа Объявление Я счастлив сообщить о своей помолвке с Джейн, единственной дочерью майора и миссис А. Д. Коллинз, проживающей на Кафедрал авеню, 25, Кентербери. Свадьба состоится в церкви св. Мар- тина 3 ноября в 2 часа 30 минут дня. $ nroff —ms mynews | Ipr & печать (в фоновом режиме) $ Ad выход из системы Сеанс 3: подготовка программы Сеанс представляет интерес только для программистов. Он де- монстрирует подготовку и выполнение программы на языке С. При входе в систему мы прежде всего изменяем текущий ка- талог на каталог project, который содержит файлы, связанные с нашим программистским проектом. Затем мы выводим список файлов этого каталога, чтобы вспомнить, что там находится. В результате мы вспоминаем, что файл с именем average.с со- держит программу, над которой мы хотели бы поработать. До- пустим, что этот файл содержит программу на С, с которой мы познакомились в гл. 12, т. е.
Приложение А. Примеры сеансов работы за терминалом 261 /*-------поиск среднего из N чисел------------*/ ^include <stdio.h> main () int п, к; float sum, number; scanf("%d",&n); sum = 0; for (k=l; к < = n; к ++) { scanf("%f”,&number); sum += number; } if (n > 0) printf("Среднее =%f\n", sum/n); else printf("Her чисел в потоке данных\п"); Мы хотим расширить эту программу, добавив в ее начало допол- нительные строки printf ("Введите количество чисел\п"); printf ("А затем—сами числа\п"); Для того чтобы это сделать, мы используем редактор ed и встав- ляем эти две дополнительные строки перед первой выполняемой строкой в программе — первой строкой, содержащей «scan». К несчастью, мы допустили ошибку при вводе второй вновь вво- димой строки: упустили закрывающую скобку«)». Не подозревая об этой небольшой ошибке, мы записываем «улучшенную» вер- сию программы на место предыдущей и компилируем ее, исполь- зуя языковый процесс сс. Мы получаем сообщение об ошибке. Нашими следующими действиями являются исправление ошибки при помощи редактора и затем повторная компиляция исправленной программы. На этот раз сс молчит, и его молча- ние — хороший признак: ни одной синтаксической ошибки в нашей программе не обнаружено и, следовательно, будет создана выполнимая программа a.out. Мы выполняем эту программу, задавая ей в качестве данных число 4, за которым следуют че- тыре числа, из которых хотим получить среднее. Программа Дает правильный ответ. Наконец, мы выполняем программу, используя данные из файла data, и получаем среднее арифметическое чисел в этом
262 Приложение А. Примеры сеансов работы за терминалом файле; добавочные сообщения, которые мы ввели в программу, все еще выводятся на дисплей, хотя данные не набираются с тер- минала. Возможно, наше изменение программы было довольно глупым. login: me password: cleverme $ cd project $ Is a.out average.c data manual $ ed average.c 295 /scan/ scanf("%d",&n); ввод входного имени ввод пароля изменение текущего каталога список файлов редактирование (размер файла) поиск “scan” (результат поиска) вставка перед этой строкой printf ("Введите количество чисел\п"); printff'A затем — сами числа\п"; завершение вставляемого текста w запись файла 369 (размер файла) q выход из редактора $ сс average.c компиляция "average.c", строка 11: синтаксическая ошибка (сообщение об ошибке) $ ed average.c повторное редактирование 369 ( размер файла) 11 вывод 11-й строки printff'A затем—сами числа \п"; (строка И) s/;/);/p замена на “);" printff'A затем—сами числа\п"); (результат замены) запись файла, (размер файла) выход из редактора повторная компиляция выполнение w 370 q $ cc average.c $ a.out Введите количество чисел А затем—сами числа 4 20 20.5 21 20.5 Среднее =20.500000 $ a.out <data Введите количество чисел количество чисел числа, из которых находится среднее. (программа дает ответ) использование файла данных (нежелательные сообщения—см. комментарий )
Приложение А. Примеры сеансов работы за терминалом 263 А затем — сами числа Среднее =167.456051 (среднее значение данных) $ Ad выход из системы Сеанс 4: использование дерева файловой системы В данном сеансе мы хотим собрать ряд статей для выпуска жур- нала, редактором которого мы являемся (редактором в обычном смысле, а не в смысле ed). После входа в систему мы создаем новый каталог, magazine, для выпуска журнала и делаем его текущим каталогом. Журнал будет строиться из четырех су- ществующих файлов: (1) editorial, который находится в нашем личном каталоге; (2) smut, который находится в личном каталоге derek пользова- теля по имени Дерек; (3) dirt, который находится в каталоге mag, подкаталоге личного каталога jill пользователя Джил; (4) grime, который находится в личном каталоге jack пользова- теля Джека. Будучи редактором, мы планируем правку статей, чтобы они соответствовали стилю журнала. Джек и Джил хотят сохранить оригиналы своих статей; они просили нас сделать с них копии и root usr I I 1 I г Jack jill derek me grime mag smut magazine editorial dirt articlel article 2 articles articled Рис. A.l. Дерево файловой системы. делать правку в копиях, а не в оригиналах. Дерек более довер- чив: он дает нам разрешение на запись в своей файл smut, так что мы можем изменять его по своему усмотрению. Мы решаем перенести все четыре статьи в наш новый каталог и дать им имена: articlel, article2, articles и article4 Рис. A.l показывает расположение интересующих нас файлов, включая наши новые файлы, в дереве файловой системы.
264 Приложение А. Примеры сеансов работы за терминалом Нашим первым действием будет пересылка файла editorial из нашего личного каталога в каталог magazine с переименова- нием его в articlel. Вторым действием будет создание ссылки article? — синонима существующего файла Дерека smut. Это делается при помощи команды In. С этого момента любое из- менение в article? вызывает соответствующее изменение в файле smut — на самом деле это один и тот же файл. Последним нашим действием по созданию нового каталога является изготовление копий с работ Джил и Джека. Это можно сделать с помощью команды ср. К несчастью, попытка скопиро- вать файл Джека терпит неудачу, так как мы не получили не- обходимых полномочий на доступ к его файлу grime. Возможны две причины этого • у нас нет разрешения на чтение его файла grime; • у нас нет разрешения на выполнение для одного из каталогов, расположенных на пути к файлу grime, например у нас нет разрешения на выполнение для личного каталога Джека. Мы используем опцию —1 команды 1s для вывода полномочий файла grime и обнаруживаем, что загвоздка состоит в том, что мы не получили разрешения на чтение этого файла. Конечно, мы не можем изменять полномочия файла, который принадлежит Джеку, следовательно, все, что мы можем сделать,— это послать ему почтовое сообщение. В заключение мы выводим список файлов, содержащихся в новом каталоге, чтобы посмотреть, что файлы articlel, article? и article3 действительно в нем находятся и узнать их размер. Заметим, что так как мы сделали ссылку на файл Дерека, а не скопировали его, то он имеет прежнего владельца (см. третье поле вывода команды 1s). Цифра 2 во втором поле строки для файла article? показывает, что article?.является одним из двух синони- мов файла. login: me password: cleverme $ mkdir magazine вводим входное имя вводим пароль создаем новый каталог $ cd magazine $ mv ../editorial articlel $ In /usr/derek/smut article? $ cp /usr/jil 1/mag/dirt articles $ cp /usr/jack/grime article4 делаем его текущим пересылка первой статьи ссылка на вторую статью копирование третьей статьи попытка копировать ср: не могу открыть /usr/jack/grime (сообщение об ошибке) $ 1s —1 /usr/jack/grime смотрим полномочия — rw------------------1 jack 5708 Jun 30 10:17 grime
Приложение А. Примеры сеансов работы за терминалом 265 $ mail jack Пожалуйста, разреши мне твой файл grime. $ Is —1 total 14 —rw—г----г----1 me —rw—rw—rw— 2 derek —rw—r----r----1 me $ Ad (читать может только владелец) посылаем почту читать завершение сообщения вывод списка файлов (использовано блоков файло- вого пространства) 2112 Jun 27 17:58 articlel 3329 Jun 25 15:37 article2 799 Jun 5 12:32 article3 выход из системы
ПРИЛОЖЕНИЕ В СПИСОК КОМАНД Это приложение, предназначенное для быстрых справок, со- держит спецификации команд, описанных в данной книге. Мы покажем синтаксис каждой команды, страницу в книге, где на- ходится ее описание, краткую спецификацию и пример. Мы опи- шем основные опции, имеющиеся в командах, включая некоторые нерассмотренные в основном тексте, но не будем пытаться дать исчерпывающее описание каждой отдельной опции. На самом деле, если опции в некоторой команде используются редко, мы не будем рассматривать их вовсе. Опции несколько различаются в разных реализациях UNIX, поэтому единственным точным описанием доступных вам опций является документация по ва- шей системе. В конце приложения приведен список дополнительных команд, которые либо не были упомянуты в книге, либо были описаны только в общих чертах. Это главным образом специализирован- ные команды, но ни в коем случае не считайте их второстепенны- ми: до чего нет дела одному пользователю, является жизненно важным для другого пользователя. Команды описываются с помощью той же синтаксической нотации, что и в руководстве по системе UNIX. Заметим, что список опций, каждая из которых может быть одной буквой или цифрой, специфицируется в виде [—[xyz]] Это означает, что опция состоит из знака минус, за которым сле- дует любая комбинация букв х, у и z, записанных в любом по- рядке. Таким образом, возможно следующее задание этой опции: — Z, —ху, —ух, —xyz и —yzx. Спецификация команд at время [месяц день} [файл] выполнить в будущем 245 делается копия указанного файла, который должен содержать одну или более команд оболочки; эта копия будет выполнена в указанное время: в течение следующих 24 часов или в задан- ный месяц и день. Если файл опущен, то используется стан- дартный ввод.
Приложение В. Список команд 267 Пример, at 0920 dec 25 х (выполнить файл х утром в день рождества) cat [файл]... сконкатенировать и вывести 72 копирует файлы в стандартный вывод. Пример, cat parti part2 >afile (скопировать parti плюс part2 в afile) cd [каталог] изменить каталог 81 изменяет текущий каталог на указанный каталог, а если он опущен, то на личный каталог. Пример, cd novel chmod ddd файл... изменить полномочия 79 изменяет полномочия файлов на ddd. Каждая d является циф- рой от 0 до 7, и эти цифры относятся соответственно к владель- цу, группе и всем остальным. (Для описания полномочий существует также альтернативный синтаксис.) Пример, chmod 660 afile (разрешает владельцу и его группе читать и писать ) comm [—[123]] файл1 файл2 найти общие строки 248 сравнивает упорядоченные файлы файл1 и файл2. Вывод производится в три колонки: (1) строки, имеющиеся только в файле!; (2) строки, имеющиеся только в файле2; (3) общие строки. Опции могут использоваться для подавления любых из этих колонок. Пример, comm —12 lost found (указывает общие строки) ср файл! файл2 копирование 84 копирует файл! в файл2 (перезаписывает его, если он уже существует). Имеется также возможность для копирования последовательности файлов. Пример, ср /usr/john/his mine (делает копию чужого файла) date выдать дату 70 выводит текущую дату и время. Пример, date diction [файл]... проверка стиля 223
268 Приложение В. Список команд указывает внутри файлов предложения, которые содержат явно неправильные обороты английского языка. Файлы могут быть представлены в формате nroff. Пример, diction chapters (проверка стиля текста в файле chapters) diff [—[beh]] файл! файл2 найти различия 247 находит различия в файлах файл! и файл2. Вывод базируется на последовательности команд редактора ed для создания одного файла из другого. Опция Ь смягчает значимость про- белов; опция е приводит к выводу строго в формате редактора ed; опция h выполняет поверхностное сравнение. Пример, diff newx oldx (найти различие между двумя версиями файла) du [—а] I—s] [файл]... подытожить использование диска 249 сообщает о количестве дискового пространства (в блоках), занятого под файлы. Обычно каждый файл является катало- гом, и du выдает общий размер пространства, занимаемого файлами этого каталога и всех его подкаталогов. Если файлы не заданы, предполагается текущий каталог. Опция а делает более подробный анализ и выдает информацию по отдельным файлам; опция s выдает более краткую информацию. Пример, du (сообщает о размере файлов в те- кущем каталоге) echo [—п] [аргумент]... эхо 107 копирует аргументы в стандартный вывод. Опция п подавляет перевод строки в конце строки; последовательные команды echo будут выводить результаты в одну и ту же строку. Пример, echo Файлы, начинающиеся с f: f* (выдает список файлов начи- нающихся с «f») ed [файл] редактор 127 редактирование файла (если файл опущен, то редактирование начинается с пустым буфером). Пример, ed afile grep [-опции] образец [файл]... глобальный поиск и печать регу- лярных выражений 97
Приложение В. Список команд 269 выводит все строки файлов, которые содержат заданный об- разец, являющийся «регулярным выражением» в смысле ре- дактора ed. Некоторые опции: с подсчитывает количество строк, содержащих искомый образец; 1 выдает имена файлов, содержащих искомый образец; п выдает номер каждой строки, содержащей искомый обра- зец; v выдает все строки, которые не содержат заданный образец; у не различать прописные и строчные буквы. Пример, grep program chapter* (ищет строки, содержащие «program») kill ид-проц уничтожить процесс 113 уничтожает фоновый процесс, который идентифицирует чис- лом ид-проц. Пример, kill 4583 In файл [имя] создать синоним для файла 88 добавляет имя в текущий каталог и делает его синонимом файла. (Если имя опущено, то предполагается, что оно явля- ется последней компонентой маршрутного имени файла.) Пример. In /usr/john/data х (х становится синонимом файла data пользователя john). Ipr [-m] файл... вывод на построчное печатающее устройство 114 обеспечивает вывод файлов на печать. Печать осуществляется в фоновом режиме, пока продолжается другая работа. Оп- ция m вызывает посылку вам сообщения об окончании печати. Пример. Ipr chapter6 (печать файла chapters) Is [—adirstu]] файл... вывод списка имен файлов 71 если файл является каталогом (нормальный случай), то команда выводит список файлов, которые в нем содержатся; если файл не является каталогом, то команда выводит только его имя. Наиболее важные опции следующие: а дает список всех файлов, даже тех, чьи имена начинаются с точки; d обрабатывает каталог как обычный файл — поэтому не выводит его содержимое; 1 выводит листинг в «длинном» (long) формате, который включает свойства файла (владелец, полномочия и т. д.)
270 Приложение В. Список команд Другие опции касаются порядка, в котором должен быть от- сортирован список имен файлов. Пример. 1s —1 novel (выводит полный листинг каталога novel) mail [входное-имя] посылка или чтение почты 171 если указано входное-имя, то пользователю с этим именем посылается сообщение; это сообщение берется из стандартного ввода. Если входное-имя не задано, то это вызывает вход в почтовую систему, чтобы прочитать пришедшую почту. Пример, mail john (посылка почты пользователю Джон) man [раздел] заглавие вывод на дисплей страницы руководства 163 производит поиск в заданном разделе Руководства для про- граммиста системы UNIX страницы с данным заглавием и вывод этой страницы. Если раздел опущен, то поиск идет по всему руководству. Пример, man chess (выдает документацию по программе игры в шахматы) mesg [п] [у] разрешить (запретить) посылку сообщений 174 запрещает (если п) или разрешает (в случае у) другим пользо- вателям применять команду write для посылки сообщений на ваш терминал. Если ни одна опция не задана, то выдается информация о текущем состоянии. Пример, mesg п (запрещает другим пользователям посы- лать вам сообщения) mkdir имя ... создать каталог 80 создает внутри текущего каталога новые каталоги с задан- ными именами. Пример, mkdir novel [создает каталог novel) mv файл! файл2 переслать файл 84 переименовывает файл1 в файл2. Если файл2 уже существует, то предыдущая версия теряется. (Есть также варианты mv для переименования каталогов или последовательности файлов.) Пример, mv /novel/х х (переслать файл х в текущий каталог) nroff [—опция] ... [—ms] [файл] ... форматор текста 192 форматирует файлы, используя специальные запросы форма- тора, помещенные в них, и посылает результат в стандартный вывод. Если задан форматор troff, а не nroff, то вывод подго-
Приложение В. Список команд 271 тавливается в формате наборного устройства. Опция ms ука- зывает, что будет использоваться макробиблиотека запросов ms. К другим важным опциям относятся: е сделать одинаковые пробелы между словами в вырав- ненных строках; mV начать нумерацию страниц с N; Тимя подготовить вывод для терминала типа имя. Пример. nroff —ms chapter6 (форматировать файл chapter6) passwd установить пароль 250 начинает диалог для установки нового пароля. Пример, passwd рг [-опция] ... файл ... печать 251 выводит на дисплей файлы, разделяя их на страницы с заго- ловками и хвостовиками. Наиболее важной опцией является —N, где N — цифра: она задает вывод в N колонок. Сущест- вует также большое число опций, касающихся оформления страниц, размера страниц, нумерации и т. д. Пример рг —3 names (вывод файла names в 3 колонки) ps [—[al]] выдать статус процесса 113 выдает информацию о ваших текущих процессах. Опция а охватывает процессы всех пользователей, а опция 1 задает более подробный листинг. Пример, ps pwd печать рабочего каталога 81 выводит полное маршрутное имя текущего каталога (т. е. «рабочего» каталога). Пример, pwd rm [-опции] файл ... удаление файлов 86 удаляет файлы. Наиболее важными опциями являются 1 (удаление файлов в интерактивном режиме), которая запра- шивает у вас подтверждение на каждое удаление, иг — силь- нодействующая опция, которая «рекурсивно» удаляет ката- лог и все файлы в нем, включая подкаталоги. Пример, rm chap ter 6 (удалить файл chapter6) rmdir каталог удаление каталога 87
272 Приложение В. Список команд удаляет каталог, который должен быть пустым, т. е. все его файлы уже должны быть удалены. Пример, rmdir novel (удалить каталог novel) sh [файл]... выполнить оболочку 115 выполняет файлы как команды для оболочки sh. Пример, sh doit (выполнить команды оболочки, хранящиеся в doit) spell I—b] [файл]... проверить правописание 15 служит для проверки правописания текста в файлах и вывода слов, написанных неверно. Файлы могут быть представлены в формате nroff. Опция Ь используется в случае английского правописания. Пример, spell —b chapter6 (проверить правописание в файле chapte.-б) stty [опция] ... установить опции терминала 252 устанавливает опции, контролирующие поведение вашего терминала. Если опции не заданы, то сообщаются их теку- щие установки. К некоторым из наиболее часто используемых опций относятся even разрешить ввод литер с четным паритетом; — even запретить ввод литер с четным паритетом; odd разрешить ввод литер с нечетным паритетом; — odd запретить ввод литер с нечетным паритетом; echo отображать входные литеры на дисплей; — echo не отображать входные литеры на дисплей; lease преобразовывать вводимые строчные буквы в про- писные; —lease не преобразовывать вводимые строчные буквы в про- писные; nl воспринимать в качестве конца входной строки только символ перевода строки; —nl воспринимать в качестве конца входной строки и символ возврата каретки; tabs не преобразовывать литеры табул$щии в пробелы при выводе на дисплей; —tabs преобразовывать литеры табуляции в пробелы при выводе; erase с сделать клавишей стирания клавишу cj kill с сделать клавишей отмены клавишу с.
Приложение В. Список команд 273 Пример, stty erase = (сделать знак «=» литерой стирания) stylet—опция] ... [файл]... проанализировать стиль 223 дает статистическую информацию о стиле файлов, которые могут быть представлены в формате nroff. Опции можно ис- пользовать для вывода предложений с определенными свой- ствами, например, а вывод всех предложений и их длин; е вывод предложений, которые начинаются с вводных оборотов; 1 N вывод предложений длиннее, чем из N слов; р вывод предложений, которые содержат глаголы в пас- сивной форме; Р вывод частей речи; г М вывод предложений, индекс чтения которых превы- шает N. Пример, style chapter6 tail [файл] выдать конец файла 253 выводит несколько последних строк файла. Пример, tail afile tty дать имя терминала 244 выдает маршрутное имя вашего терминала. (Это соответствует концепции UNIX, согласно которой устройства рассматри- ваются как файлы.) Пример, tty wc [—[clw]] [файл] ... подсчитать число слов 254 выводит количество слов, строк и литер в файлах. Если тре- буются только некоторые из этих трех чисел, то опцию с мож- но использовать для вывода числа литер, а опциями 1 и w можно воспользоваться, чтобы вывести число строк и слов со- ответственно. Пример. 'Nc chapter6 (подсчет числа слов, строк и литер в файле chapters) who [am I] сообщить, кто работает в системе 168 выдает информацию о всех пользователях, работающих в данный момент в системе. Если задано «ат I», то выдается информация только о текущем пользователе.
274 Приложение В. Список команд Пример, who write входное-имя послать сообщение 169 посылает сообщение (которое берется из стандартного ввода) пользователю с заданным входным-именем. Основная цель команды write — прямая и срочная связь; в других случаях более предпочтительна команда mail Пример, write john (посылка сообщения пользователю john) Дополнительные команды П рограммирование acjb, sdb as сс f77 id lint отладчики; ассемблер; компилятор С; компилятор Фортрана 77; загрузчик; верификатор программ на С. Кроме того, имеется большое число других языковых про- цессоров, средств для построения компиляторов и т. д. Команды различного назначения аг архивариус (библиотекарь); awk язык сопоставления с образцами; cal выдача календаря; calendar служба напоминания; стр сравнение файлов; csh оболочка, альтернативная sh; crypt шифровка; dd копирование файлов — эта команда полезна для работы с магнитными лентами и т. п. (см. также tar); eqn, neqn препроцессоры для набора математических формул; explain программа, объясняющая вывод команды diction; file анализатор файлов; find полек файлов; learn обучающая система; login вход в систему нового пользователя; make создатель файлоз; sleep прожигатель времени; sort сортировка и слияние файлов; tabs проверка позиций табуляции терминала; tar создание архива на магнитной ленте; tbl препроцессор для набора таблиц; tee Т-образный стык в конвейере;
Приложение В. Список команд 275 time tr uniq uucp vi игры таймер; преобразователь литер; удаление одинаковых соседних строк файла; копирование файлов из UNIX в UNIX; экранный редактор; см. раздел 6 Руководства для программиста сис- темы UNIX. Кроме перечисленных команд, могут быть бесценные мест- ные команды, такие как системы help (или apropos), checknr и finger.
ЛИТЕРАТУРА Bourn S. (1983). The UNIX system, Addison-Wesley, London. (Имеется перевод: Баурн С. Операционная система UNIX.— М.: Мир, 1986.) Cherry L. L., Vesterman W. (1981). Writing tools — the STYLE and DICTI- ON programs, Computer Science Technical Report 91, Bell Laboratories, Murray Hill, N. J. Deitel H. M. (1983). An introduction to operating systems, Addison-Wesley, Reading, Mass. (Имеется перевод: Дейтел Г. Введение в операционные системы.— М.: Мир, 1987.) Feuer A., Gehani N. Н. (1982). “A comparison of the programming langua- ges C and PASCAL”, Computer Surveys 14, 1, pp. 73—92. Kernighan B. W. (1978). UNIX for beginners — Second edition. (In Vo- lume 2 of UNIX Programmer’s Manual.) Kernighan B. W. (1981). Why Pascal is not my favorite programming lan- guage, Computer Science Technical Report 100, Bell Laboratories, Murray Hill, N. J. Kernighan B. W., Plauger P. J. (1976). Software tools, Addison-Wesley, Reading, Mass. Kernighan B. W., Plauger P. J. (1981). Software tools in Pascal, Addison- Wesley, Reading, Mass. (Имеется перевод: Керниган Б., Плоджер П. Инструментальные программные средства для программирующих на Паскале,— М.: Радио и связь, 1985.) Kernighan В. W., Ritchie D. М. (1978). The С programming language, Prentice-Hall, Englewood Cliffs, N. J. (Имеется перевод: Керниган Б. и др. Язык программирования Си. Задачи по языку.— М.: Финансы и статистика, 1985.) Knuth D. Е. (1973). The art of computer programming. Volume 1, Second edition, Addison-Wesley, Reading, Mass. (Имеется перевод: Кнут Д. Искусство программирования для ЭВМ. Т. 1. Основные алгоритмы.— М.: Мир, 1976.) Lister А. М. (1979). Fundamentals of operating systems, Second edition, Mac- millan, London. Lucas Phillips С. E. (1952). The small garden, Pan, London. Переиздавался много раз. Ritchie D. M,, Thompson K. (1974). “The Unix time-sharing system”, Comm. ACM 17,7, pp. 365—375; Перепечатан в Comm. ACM 26,1 (1983), pp. 84—89. Wilkes M. V. (1972). Time-sharing computer systems, Macdonald/Elsevier, London.
указатель Абзац (paragraph) 198, 200, 201 — сдвинутый (indented) 200, 201 Аварийный отказ (crash) 176 Автоматизированная система обуче- ния (computer-aided instruction) 167 Ада (Ada) 228 Адаптация (adaptation) 44 Адреса редактора (addresses) 155 Алгоритм планирования (schedul- ing algorithm) 24 — — циклический (robin-round) 24 Амперсанд (ampersand) 151 Английское правописание (British spelling) 96, 122 Аргумент команды (argument) 71, 78, 98, 199 Архив (archive) 55 Ассемблер (assembler) 241 Байт (byte) 34 Баурн. (Bourne) 37, 101 Бейсик (Basic) 126, 193, 228, 234 Библиотека (library) 241 — встроенная (built-in) 241 Блок (block) 35, 76, 249 Буфер (buffer) 128, 133—135 Буферная копия (buffer сору) 128 Ввод (в nroff) (input) 194 Ввод/вывод (input/output) 25, 56— 63 Версия семь (Version Seven) 255 Владелец (owner) 49, 77 Временной квант (интервал) (time- slot) 23 Время (time) 245 Время ответа (response time) 23 Вспомогательное меню (subsidiary help system) 167 Встроенные запросы (в nroff) (bu- ilt-in requests) 219 Вход в систему (logging in) 27 Входное имя (login name) 27, 49 Входной файл (profile) 123 Вывод (в nroff) (output) 93, 218 Выполняемая программа (execu- table program) 234, 235 Выравнивание текста (justify text) 190 Выход из системы (logging out) 27 Группа (group) 49 Графические программы (graphics) 61 Дамп (core dump) 186 Двоичная форма (binary form) 33, 40 Двойной интервал (double spacing) 211 Декодирующая программа (decod- ing program) 65 Дерево (tree) 45, 77, 83, 117 — единое (single) 46, 48 — полное (overall) 45, 47 — файловой системы 263 Дейтел (Deitel) 23 Диск (disk) 25, 35, 48 — гибкий (floppy) 36, 38 — сменный (removable) 36 — фиксированный (fix) 36 Директорий (directory) см. Каталог Длина страницы (page length) 211 — строки (line length) 211 Документ (document) 17 Домашний стиль (house style) 207 Дотошный Дадли (Dudley Detail) 48, 77, 99, 120 Дружелюбный по отношению к пользователю (user-friendly) 11 Жирная точка (bullet) 205 Зависание терминала (hung termi- nal) 178
278 Указатель Задача (task) 22 Загрузчик (loader) 237 Замена (replacement) 139 Замок (lock) 37 Запись (write) 50 Заполнение текста (fill text) 190 Запрос (request) 194, 196 Зарезервированные слова (reserved words) 230 Защита (protection) 48, 52, 53 Игры (games) 162, 253, 275 Идентификатор процесса (process ID) 112 Иерархия (hierarchy) 39, 256 Иллюстрации (displays) 201 Имя каталога (directory name) 69, 78 — команды (command name) 118 — файла (filename) 32, 104, 244 Интерпретатор (interpreter) 27 Исходная программа (source pro- gram) 234 — форма (source form) 33, 40 Каталог (directory) 39, 76, 117, 263 — дочерний (child) 45 — командный (bin) 118, 119 — корневой (root) 77, 88, 183 — личный (home) 41, 81, 122 — — телефонный (personal tele- phone) 40 — родительский (parent) 45, 83, 123 — текущий (current) 41, 47, 81, 122 — bin см. Каталог командный — usr 47, 49, 119 — usr/me 71, 119 Керниган (Kernighan) 66, 70, 233 Клавиатура (keyboard) 56 Клавиша BACKSPACE (возврат на шаг) 56, 58 — BREAK (останов) 56, 60, 69 — CONTROL 59 — DEL (удаление) 56, 58 — ESC (авторегистр) 56 — RETURN (возврат каретки) 58, 59, 69 Кнут (Knuth) 45 Колонтитул (footer) 190 Команда (command) 17 — apropos см. help — at 245, 266 — cat 14, 16, 72, 73, 95, 108, 267 — cd 81, 87, 267 — checknr 206, 275 — chmod 79, 80, 97, 99, 233, 267 — comm 248, 267 — cp 84, 85, 99, 181, 267 — date 70—72, 267 — diction 220, 223, 267 — diff 247, 268 — du 249, 268 — echo 107, 252, 268 — ed 15, 16, 127, 268 — explain 274 - file 274 - find 182, 274 — finger 169, 275 — grep 93, 94, 97, 102, 103, 152, 153, 268 — help 165, 166, 275 — how 166 — kill 113, 269, 272 — learn 167, 274 — In 88, 269 — login 277 — logout 91 — Ipr 114, 244, 269 — Is 16, 33, 70—72, 82, 99, 109, 269 — mail 169—172, 270 — make 239, 240, 274 — man 163, 166, 167, 19e, 270 — mesg 174, 270 — mkdir 80, 270 — mv 84, 99, 270 — more 59 — nroff 189, 192, 270 — opr 114 — page 59 — passwd 250, 271 - pr 251, 271 — ps 113, 169, 271 — pwd 81, 182, 271 - rm 85, 86, 91, 98, 104, 271 — rmdir 87, 271 - set 122, 184 - sh 115, 122, 272 — shift 122 — sleep 247 — sort 110, 274 — spell 15, 16, 29, 62, 82, 94, 95, 109, 122, 272 — stty 61, 252, 272 — style 220—223, 273 — suggest 224 — tail 253, 273 — tee 66, 274 - tr 110, 275 — troff 65, 189 — tty 244, 273 — uniq 11©, 275
Указатель 279 — uucp 175, 275 — vi 157, 275 — wc 254 — who 168, 273 — write 169, 274 Командная подсказка (command prompt) 70 Команды оболочки (shell com- mands) 115—117 — редактора 156 Компилятор (compiler) 226, 227, 234 Компиляция (compiling) 237—240 Конвейер (pipe) 64, 109—111, 154 Конкатенация (concatenating) 72, 102 Контекстный поиск (context search) 142, 147 Корень (root) 46 Ленты (tapes) 35 Листер (Lister) 23 Лукас (Lucas) 52 Макробиблиотека (macro library) 197, 215 — ms 220 Макроопределение (macros) 196 — 203, 215 — man 198, 216 — mm 197 — ms 197, 207, 214, 216 Макросы см. Макроопределения Маршрут поиска (search path) 118, 119, 122 Маршрутное имя (pathname) 42, 47, 82, 83, 182 Меню (menu) 167 Металитера оболочки (wildcard) 102, 103, 150 — редактора (metacharacter) 147, 148, 150, 155 Метка (в nroff) (label) 200 Многопользовательская операци- онная система (multi-user operat- ing system) 22 Модуль (module) 237 Мультипроцессорная обработка (multi-processing) 26 Мусор (garbage) 179 — Баурна (Bourne shell) 101, 121 — С (С shell) 101, 121 Образец (pattern) 139, 147, 149, 152 Обратная косая черта (backslash) 204, 205 Объектная форма (object code) 237 Объектный файл (object file) 237 Однопользовательская система (single-user system) 22 Окно (window) 157 Окружение см. Среда Описание зависимости (dependency line) 239 Опция (option) 75, 78, 96, 193, 266 Останов (breaking) 142 Отладка (debugging) 240 Отладочные системы (debugging sys- tems) 241 Отшл (hrmt) 71, 81, 132 Ошибки (errors) 139, 157, 180—185 Пароль (password) 27, 250 Паскаль (Paskal) ' 127, 193, 228 Переадресация (redirection) 62, 108 Периферийные устройства (peri- pheral devices) 243 Печатающий терминал (printing terminal) 12 Плоджер (Plauger) 66, 127 Подкаталог (sub-directory) 118, 119, 263 Подсказка (prompt) 14 Полномочия (permissions) 50, 51, 76, 79 Полный дуплекс (full-duplex) 59 Почта (mail) 167 Почтовый ящик (mailbox) 172, 173 Права доступа (access rights) 51 Препроцессоры (preprocessors) 197, 203 Прерывание (interrupt) 60 Пробел (space) 207 Программы оболочки (shell pro- grams) 117 Прокрутка (scrolling) 59 Просмотр (browsing) 142 Простой (time-out) 92 Процесс (process) 22 Пунктуация (punctuation) 207 Пустые строки (blank lines) 211 НСЛОПЕ (WIBNI) 64 Оболочка (shell) 61, 92, 101, 115 Раздел (section) 198 Разделение (совместное использо- вание) 21—27 Размер страницы (page size) 210
280 Указатель расширение (extension) 32, 105, 238 регулярные выражения (regular ex- pressions) 148 Редактор (editor) 15, 125, 127 — контекстный (context) 126 — построчный (line-based) 126 — связей (linking loader) 237 — экранный (screen) 126 — em 126 — ex 127 — vi 126 Режим (mode) 51 Ритчи (Ritchie) 19, 71, 233 Руководство для пользователя по NROFF/TROFF (NROFF/TROFF User’s Manual) 205 Руководство для программиста системы UNIX (UNIX Program- mer’s Manual) 18, 160, 163, 189, 198, 215, 241, 253 Сеанс (session) 27 Секретный маркер (secret mark) 117 Семантика (semantics) 94 Сети (networks) 57, 167 Синтаксис (syntax) 94, 99 Система кодирования (coding sys- tem) 33 — — стандартная 33 Системные программы (system pro- grams) 16 — функции (system calls) 233 Скользкие места в редакторе 157 Слова (words) 72 Сноска (foot note) 190 Содержимое (content) 87 Сообщение об ошибках (редактор) (error message) 157, 180 Справочные страницы (manual pa- ges) 162-164, 216 Спулинг (spooling) 63, 114, 244 Среда (environment) 212 Средство (tool) 17 Ссылки (links) 88, 89 Стандартный ввод (standard input) 62, 73, 99, ПО — вывод (output) 62 — — диагностики (standard error output) 62, НО Степень читаемости (readability grades) 221 Суперпользователь (superuser) 26, 49, 70 Табуляция (tab) 202, 203 Твердая копия (hard сору) 12 Текстовая форма см. Исходная фор- ма Текстовый файл (character file) 32 Текущая литера (current character) 157 — строка (current line) 128, 130 Текущий файл (current file) 130 Терминал (terminal) 139 Томпсон (Thompson) 19, 71 Уилкс (Wilkes) 23 Файл (file) 14, 31 — двоичный (binary file) 33 Файл-устройство (device filename) 244 Файловая система (file system) 16, 32, 47, 117 — — постоянная (permanent) 36 — — сменная (removable) 36 Файловое пространство (file space) 249 Фильтр (filter) 66 Фоновые команды 112 Фоновый процесс (background pro- cess) 109, 113 Форматоры текстов (text format- ters) 188 Фортран (Fortran) 127 Фортран 77 (Fortran 77) 235 Функция (function) 231 Характеристики терминала (termi- nal characteristics) 60 Центрирование (centring) 212 Цепочка (string) 128, 139, 149 Циклический поиск (wrap-around) Число ссылок (number of links) 77, 89 Чтение (read) 50 Шрифт (font) 191, 203 — курсив (italic) 191 — полужирный (bold) 191, 193 — прямой светлый (Roman) 191, 193
Указатель 281 Электронная почта (electronic mail) — — внешний (external) 240 30, 258 — — общий (common) 240 Язык С (language С) 18, 227, 240 Языковый процессор (language рго- Язык оболочки 121 cessor) 227, 234, 240 Язык программирования (prog- ramming language) 240
ОГЛАВЛЕНИЕ От редакторов перевода ......................................... 5 Предисловие .................................................. 1 ЧАСТЬ I. ИДЕИ И КОНЦЕПЦИИ.................................. 10 Глава 1. Введение....................................... 10 Виды операционных систем.............................. 11 Дружелюбна ли система UNIX?........................... 11 Виды терминалов....................................... 12 Пример . ............................................. 13 Команды и программы................................... 16 Подготовка документов ............................... Д7 Оперативная документация.............................. 18 Язык программирования С.............................. 18 История............................................... 19 Чем меньше, тем лучше................................. 19 Глава 2. Разделение ЭВМ между пользователями . . 21 Как работают операционные системы....................... 22 Как ЭВМ обслуживает несколько одновременно работающих пользователей? ......................................... 23 Защита и суперпользователь.............................. 26 Вход в систему.......................................... 27 Определение пароля другого пользователя................. 28 Защита процессов друг от друга.......................... 29 Защита файлов ......................................... 29 Учет................................................... 29 Электронная почта ...................................... 30 Глава 3. Файлы............................................. 31 Двоичные и текстовые файлы.............................. 32 Физические устройства................................... 35 Постоянные и сменные файловые системы................... 36 Разделение и защита файлов.............................. 37 Управление большим числом файлов........................ 38 Требования к файловой системе ......................... 38
Оглавление 283 Глава 4. Структура файла.................................. 39 Каталоги..........................-............... . 39 Личный телефонный каталог.............................. 40 Организация каталогов в системе UNIX................... 41 Достоинства каталогов.......................-.......... 42 Быть пионером.......................................... 44 Древовидная структура.................................. 45 Полное дерево.......................................... 45 Файлы на сменных носителях............................. 47 Введение в защиту...................................... 48 Владельцы и группы.................................... 49 Полномочия............................................. 50 Великий вредитель...................................... 52 Примеры защиты......................................... 52 Защита каталогов....................................... 53 Защита от самого себя.................................. 53 Ограниченность файловой памяти......................... 54 Глава 5. Ввод и оболочка................................ 56 Клавиатура............................................. 56 Сети................................................... 57 Ввод с клавиатуры.............’........................ 57 Прокрутка.............................................. 58 Полный дуплекс и опережающий ввод.................... 59 Характеристики терминала............................... 60 Оболочка......................................... • 61 Независимость от устройств............................. 61 Спулинг............................................... 63 Конвейеры............................................ 63 Средства программного обеспечения...................... 66 Резюме........................................ • • • 67 ЧАСТЬ II. ПРИЛОЖЕНИЕ ИДЕЙ............... 68 Глава 6. Пример сеанса................................... 68 Откровение............................................ 71 Формат команд......................................... 71 Опции................................................. 75 Анализ дерева......................................... 77 Связь опций с другими аргументами..................... 78 Изменение полномочий ................................. 79 Создание каталога .................................... 60 Маршрутные имена файлов............................... 82 Пересылка файлов...................................... 84 Копирование файлов ................................... 84 Уничтожение файлов...................' ............ 85 Создание ссылок....................................... 88 Одновременная запись.................................. 96 Борьба с Великим вредителем........................... 90
284 Оглавление Глава 7. Команды и оболочки ............................. 93 Стиль................................................. 94 Опции................................................. 96 Дополнительные аргументы.............................. 97 Заключительные замечания о стиле...................... 99 Система обозначений для описания синтаксиса........... 99 Различные оболочки . . 101 Металитеры............................................. 101 Еще несколько советов по поводу имен файлов.......... 104 Расширения........................................... 105 Файлы README........................................... 106 Сводка советов ........................................ 107 Команда echo........................................... 107 Переадресация.......................................... 108 Малодушным............................................. 109 Конвейеры............................................. 109 Использование конвейеров .............................. 111 Выполнение фоновых команд............................ 112 Использование печатающего устройства................... 114 Определение своих собственных команд................. 114 Выполнение команд оболочки .г........................ 115 Как сделать файл выполнимым......................... 116 Переадресация ввода-вывода для программ оболочки ... 117 Командные каталоги..................................... 118 Выпад против Дадли..................................... 120 Язык программирования оболочки......................... 121 Входные файлы пользователей............................ 123 Резюме об оболочке..................................... 124 Глава 8. Редактирование........................... 125 Замечание для пользователей Бейсика................... 126 Редактор ed........................................... 127 Буфер............................................... 128 Пример сеанса........................................ 130 Некоторые изменения................................... 133 Общий вид команды..................................... 136 Запись в файл......................................... 137 Изменения внутри текущей строки....................... 138 Выход из редактора . ............................... 141 Просмотр и останов.................................... 142 Полные примеры....................................... 143 Регулярные выражения ................................. 147 Примеры регулярных выражений ......................... 148 Область действия металитер редактора и оболочки .... 150 Использование амперсанда при заменах.................. 151 Массовое редактирование............................... 151 Регулярные выражения в команде grep................... 152 Включение других файлов............................... 153 Как заглянуть в окружающий мир........................ 153 Дополнительные возможности редактирования............. 154 Примеры............................................... 155 Экранное редактирование .............................. 157
Оглавление 285 Глава 9. Документация и связь............................ 159 Документация UNIX..................................... 160 Извлечение информации из руководства.................. 163 Переадресация вывода.................................. 163 Формат справочных страниц............................. 164 Другие виды помощи.................................... 165 Вспомогательные системы помощи........................ 166 Критические замечания ................................ 166 Автоматизированная система обучения .................. 167 Почта................................................ 167 Определение текущих пользователей..................... 168 Любопытным............................................ 169 Общение............................................... 169 Посылка почты....................................... 171 Получение почты....................................... 172 Управление почтой..................................... 174 Доступ к удаленным машинам............................ 175 Резюме о средствах общения.............,............> 175 Глава 10. Ошибки......................................... 176 Работает или простаивает.............................. 176 Начальные проблемы................................... 177 Зависание терминалов.................................. 178 Ненасытный аппетит................................... 179 Программа, из которой нельзя выйти.................... 179 Мусор на экране....................................... 179 Сообщения об ошибках.................................. 180 Ошибки, связанные с файлами........................... 182 Выполнение команд..................................... 183 Неправильное употребление пробелов в командах оболочки 184 Неумышленное использование металитер.................. 185 Несколько специфических сообщений.................... 185 Скверные шутки........................................ 186 Глава 11. Подготовка документов......................... 188 Форматоры текстов................................... 188 Представляемые возможности.......................... 190 Некоторые советы.................................... 192 Метод использования................................. 192 Вывод на терминал................................... 193 Подготовка входных данных.......................... 194 Комментарии......................................... 195 Прерывание страницы и строки........................ 196 Макроопределения.................................... 196 Абзацы и разделы.................................... 198 Аргументы......................................... 199 Сдвинутые абзацы................................... 200 Иллюстрации......................................... 201 Предпроцессоры...................................... 203 Шрифты.............................................. 203 Использование обратной косой черты ................. 204 Запрещенные знаки................................... 205
286 Оглавление Ошибки.............................................. 206 Домашний стиль....................................... 207 Пробелы и знаки пунктуации ....................... 207 Сырой текст.......................................... 209 Размер страницы и интервалы.......................... 210 Среды................................................ 212 Начало документа..................................... 213 Макробиблиотеки...................................... 215 Справочные страницы ................................. 216 Опасные комбинации . /............................... 216 Использование наборного устройства .................. 216 Независимость от печатающих устройств................ 218 Резюме о форматировании.............................. 218 Список запросов..................................... 219 Средства для улучшения качества текста .............. 220 Степень читаемости .................................. 221 Информация о предложениях............................ 222 Использование слов................................ . 222 Способ открытия предложений.......................... 222 Резюме о style....................................... 223 Команда diction..................................... 223 Реакция.............................................. 224 Резюме о всех средствах.............................. 225 Глава 12. Программирование............................. 226 Языки программирования.............................. 226 Разработка языков программирования.................. 227 Сравнение программ.................................. 228 Общее впечатление................................... 230 Подробный анализ программы на языке С............... 231 На языке С вы можете................................ 232 Системные функции................................... 233 Выполнение программы................................ 234 Выполнимая программа ............................... 23э Сохранение выполнимой программы..................... 235 Раздельная компиляция модулей....................... 237 Расширения...................................... • 238 Компиляция многомодульных программ.................. 238 Языки и процессоры.................................. 240 Библиотеки.......................................... 241 Следование стилю UNIX............................... 242 Резюме ........................................... 242 Глава 13. Заключительный обзор................... 243 Устройства.......................................... 243 Выполнение команд в будущем........................ 245 Сравнение файлов . . .............................. 247 Использование файлового пространства ............... 249 Изменение пароля ................................... 250 Семь смертных грехов................................ 251 Страничная печать .................................. 251 Управление терминалом .............................. 252 Игры................................................ 253
Оглавление 287 Как посмотреть на конец файла...................... 253 Подсчет............................................ 254 Версии UNIX........................................ 254 Резюме ................................................ 256 Приложение А. Примеры сеансов работы за терминалом . 258 Сеанс I: простейший пример использования почты .... 258 Сеанс 2: подготовка документа...................... 259 Сеанс 3: подготовка программы...................... 260 Сеанс 4: использование дерева файловой системы..... 263 Приложение В. Список команд.............................. 266 Спецификация команд . 266 Дополнительные команды............................. 274 Литература............................................... 276 Указатель................................................ 277
Уважаемый читатель! Ваши замечания о содержании книги, ее оформлении, качестве перевода и другие просим присылать по адресу: 129820, Москва И-110, ГСП, 1-й Рижский пер., д. 2, издательство «Мир». Учебное издание Питер Дж. Браун ВВЕДЕНИЕ В ОПЕРАЦИОННУЮ СИСТЕМУ UNIX Ст. науч. ред. А. А. Бряндинская, М. В. Хатунцева Мл. ред. Т. Ю. Дехтярева Художник Н. Я. Вовк Художественный редактор В. И. Шаповалов Технический редактор Е. В. Алехина Корректор Л. Д. Панова ИБ 5903 Сдано в набор 15.01.87. Подписано к печати 15.08.87. Формат 60X90l/u. Бумага типографская № 2. Печать 'высокая. Гарнитура литературная. Объем 9,00 бум. л. Усл. печ. л. 18,00. Усл. кр.-отт. 18,52. Уч.-изд. л. 15,77. Изд. № 1/4 566. Тираж 20 000 экз. Зак. 161. Цена 1 р. 20 к. ИЗДАТЕЛЬСТВО «МИР» 129820» ГСП, Москва, И-110, 1-й Рижский пер., 2 Ордена Октябрьской Революции и ордена Трудового Красного Знамени МПО «Первая Образцовая типография» имени А. А. Жданова Союзполиграфпрома при Государст- венном комитете СССР по делам издательств, полиграфии и книжной торговли. 113054, Москва, Валовая, 28