Руководство пользователя Linux

         

Руководство пользователя Linux


Руководство пользователя Linux ================================================================ (C) 1993, 1994 Larry Greenfield

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

- 2 -

1. Введение

1.1 Для кого предназначена эта книга

Тот ли вы, кто должен прочесть на эту книгу. Попробуйте ответить на несколько вопросов: Вы уже взяли где-то Linux, поставили его, и хотите знать что делать дальше? Или вы не являетесь пользователем Unix, и хотите узнать, что может вам дать Linux.

Если у Вас есть эта книга, ответы на эти вопросы вероятно "Да". Каждый, у кого есть Linux, свободно-распространяемая разновидность Unix, разработанная Линусом Торвальдсом (Linus Torwalds), на его компьютере, но не знает, что ему делать дальше, должен прочесть эту книгу. Она охватывает большинство основных команд Unix. Мы так же расскажем о GNU Emacs, мощном редакторе, и о некоторых других больших приложениях в Unix'е.

1.1.1 Что вы должны сделать перед чтением этой книги.

Эта книга требует выполнения нескольких условий, которые не находятся во власти автора. Прежде всего, эта книга подразумевает, что Вы имеете доступ к системе Unix. (К сожалению, очень тяжело изучить Unix не имея его.) Более того, эта Unix-система должна быть системой Linux, работающей на Intel PC. Это требование не является обязательным, но когда что-либо зависит от версии Unix, я буду ссылаться на то, как ведет себя Linux.

Имеются различные формы Linux, называемые дистрибутивами. Мы надеемся, что Вы нашли полную поставку Linux, такую как SoftLanding Linux Systems или MCC-Interim, и установили ее. Различные дистрибутивы Linux несколько отличаются, но эти отличия обычно небольшие и несущественные. (Возможно в этой книге Вы встретите места, которые будут немного отличаться от того, что будете видеть Вы. Это вероятнее всего означает, что вы используете дистрибутив, отличный от моего. Автору хотелось бы знать обо всех таких отличиях.)

- 3 -

Если Вы являетесь суперпользователем (администратором или установщиком) системы, Вы должны также зарегистрировать себя в системе как нормального пользователя. Посмотрите руководство по установке системы для того, чтобы узнать, как это сделать. Если Вы не являетесь суперпользователем, то Вы должны попросить его зарегистрировать себя в системе.


У Вас должно быть време и терпение. Изучение Linux не так уж просто - большинство пользователей находят, что научиться использовать операционную систему Macintosh Operating System намного проще. Однако многие считают, что Linux намного мощнее.

Наконец, эта книга предполагает, что Вы более-менее знакомы с некоторыми компьютерными терминами и понятиями. Хотя это требование не столь важно, это делает чтение книги более простым. Вы должны знать, что означают такие слова, как "программа" и "исполнение". Если это не так, то Вам может понадобится чья-нибудь помощь при изучении Unix.

1.2 Как избежать чтения этой книги

Лучший способ изучить почти любую компьютерную программу - это установить ее на своем компьютере. Большинство людей считают, что чтение книги без использования программы не очень то полезно. Точно также, способ научиться Unix и Linux - это использовать их. Используйте Linux для всего, что возможно. Экспериментируйте. Не бойтесь - возможно, Вы и потеряете что-либо, но вы всегда сможете это повторно инсталлировать. Делайте резервные копии и наслаждайтесь!

Хорошо это или плохо, но Unix не является такой же интуитивно понятной, как другие операционные системы. Поэтому, Вы вероятно все же прочтете по крайней мере две первые главы этой книги.

Способ номер один избежать чтения этой книги состоит в использовании доступной электронной документации. Научитесь использовать команду man - она описана в разделе 4.2.

- 4 -

1.3 Как читать эту книгу

Наиболее предпочтительный способ изучения Unix состоит в чередовании чтения книги и попыток проиграть прочитанное на системе. Играйтесь до тех пор, пока все понятия не станут для Вас привычными, а затем начинайте прыгать по всей книге. Вы увидите, что книга охватывает разные разделы, некоторые из которых могут Вас заинтересовать. После этого, Вы должны стать достаточно уверенным, чтобы начать использовать команды, не зная заранее что они должны делать.

То, что многие люди называют Unix - это оболочка Unix (shell), специальная программа, которая интерпретирует команды. Вообще, это хороший взгляд на вещи, но Вы должны знать, что Unix в действительности состоит из много большего (или много меньшего - в зависимости от точки зрения). Эта книга рассказывает о том, как использовать оболочку, программы, которые обычно поставляются с Unix, и некоторые программы, которые не всегда поставляются с Unix.



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

Глава 2 обсуждает, как Unix и Linux появились, и в каком направлении они развиваются. В ней так же говорится о Фонде Свободного Программного Обеспечения (Free Software Foundation) и проекте GNU.

Глава 3 рассказывает о том, как запустить и остановить Ваш компьютер, и что происходит в это время. Многое из того, о чем говорится в этой главе, не нужно для использования Linux, но это довольно полезно и интересно знать.

Глава 4 является введением в оболочку Unix. Это та среда, в которой люди работают и запускают программы. Здесь говорится о основных программах и командах, которые Вы должны знать для использования Unix.

- 5 -

Глава 5 охватывает все, что относится к системе X Window System. X - это основной графический интерфейс для Unix, и некоторые дистрибутивы устанавливаются по умолчанию.

Глава 6 охватывает некоторые из более глубоких понятий Unix-оболочки. Изучение приемов, описываемых в этой главе, позволяет более эффективно использовать Unix.

Глава 7 содержит короткие описания различных Unix-команд. Чем большее количество инструментов умеет использовать пользователь, тем быстрее он будет выполнять свою работу.

Глава 8 описывает текстовый редактор Emacs. Emacs - это очень большая программа, которая объединяет многие инструменты Unix общим интерфейсом.

Глава 11 описывает некоторые большие и более сложные в использовании программы.

Глава 12 рассказывает о том, как избежать ошибок при использовании Unix и Linux.

1.4 Документация Linux.

Эта книга, Руководство пользователя Linux, предназначена для начинающих пользователей Linux. Однако, имеются книги и для более опытных пользователей.

1.4.1 Другие книги о Linux

Остальные книги включают "Установка и начало использования", руководство о том, как получить и установить Linux, "Руководство Администратора Системы Linux", рассказывающее о том, как организовать и поддерживать работу системы Linux, и "Руководство по Изменению Ядра", книга о том, как модифицировать Linux. "Руководство по Сетевому Администрированию Linux" рассказывает о том, как установить, сконфигурировать и использовать сеть.



- 6 -

1.4.2 HOWTO

Дополнительно к книгам, документация Linux включает набор небольших документов, описывающих как установить и использовать различные аспекты Linux. Например, SCSI-HOWTO описывает некоторые трудности в использовании совместрно с Linux SCSI - стандартного интерфейса общения с устройствами.

Документы HOWTO доступны в нескольких форматах.

1.4.3 Проект Linux-документации

Как и почти все, что связано с Linux, Проект Linux-документации - это группа людей, работающих по всему миру. Изначально будучи организованный Ларсом Виржениусом (Lars Wirzenius), Проект в настоящее время координируется Маттом Вельшом (Matt Welsh) с помощью Майкла Джонсона (Michael K. Johnson).

Есть надежда, что Проект Linux-документации предоставит со временем все книги, необходимые для документирования Linux. Пожалуйста, сообщите нам о том, что нам удалось, и о том, что нам следует сделать. Вы можете связаться с автором по адресу greenfie@gauss.rutgers.edu и с Маттом Вельшом по адресу mdw@cs.cornell.edu.

1.5 Операционные системы

Основное предназначение операционной системы состоит в поддержке исполнения программ, в работе которых Вы заинтересованы. Например, Вы можете использовать редактор для создания документа. Этот редактор не сможет работать без помощи операционной системы - ему нужна эта помощь для взаимодействия с Вашим терминалом, Вашими файлами, и т.д.

Если от операционной системы требуется только поддержка Ваших приложений, почему же требуется целая книга, рассказывающая об операционной системе? Существует множество вспомогательных действий, которые Вам приходится выполнять. В случае Linux, операционная система так же содержит несколько мини-приложений, помогающих Вам более

- 7 -

эффективно работать. Знание операционной системы может быть полезно, когда Вы не работаете в одном громадном приложении.

Операционные системы (ОС) могут быть простыми и минимальными, такие как DOS, или большими и сложными, как OS/2 или VMS. (Каждая из этих систем имеет свои плюсы.) Unix претендует на место "золотой середины". Предоставляя больше ресурсов и делая больше, чем ранние операционные системы, он не пытается делать ВСЕ, как некоторые другие операционные системы.



Исходная философия для разработки Unix состоит в распределении функциональности по нескольким маленьким частям, программам. Изначально это было требованием, исходящим из аппаратуры, на которой Unix изначально работал. По какой-то странной причине, получившаяся операционная система оказалось весьма полезной на другой аппаратуре. Вы можете относительно просто достичь новой функциональности и новых возможностей, объединяя маленькие части (программы) новым способом. Если появляются новые утилиты (так и происходит), Вы можете встроить его в Ваш старый инструментарий. К сожалению, в наше время программы для Unix становятся все большими, и включают в себя все больше возможностей, но некоторая гибкость и возможность взаимодействия по прежнему остается. К примеру, когда я писал этот документ, я активно использовал эти программы; fvwm - для управления "окнами", emacs для редактирования текста, LaTeX - для форматирования его, xdvi для просмотра отформатированного текста, dvips - для подготовки его к печати, и, наконец lpr для печати. Если я завтра найду новую лучшую программу просмотра dvi, я смогу использовать ее вместо старой, не изменяя остальных установок.

Когда Вы используете операционную систему, Вы хотите минимизировать количество работы, которую Вам необходимо выполнить для достижения цели. Unix предоставляет несколько инструментов, которые могут помочь Вам, но только в том случае, если Вы знаете, что эти инструменты позволяют делать. Потратить час пытаясь сделать что-либо, и наконец сделать это - не очень продуктивно. Хочется надеяться, что Вы уже знаете, как правильно использовать соответствующие инструменты - в этом случае Вы не станете использовать молоток, чтобы затянуть винт.

- 8 -

Основная часть операционной системы называется "ядро". Во многих опреационных системах, таких как Unix, OS/2 или VMS, ядро предоставляет функции, которые используются исполняемыми программами, и планирует исполнение этих программ. Проще говоря, программа A может получить столько-то времени процессора, программа B - столько-то, и т.д. Одна школа говорит, что ядра должны быть очень маленькими, и не предоставлять много ресурсов программам. Это позволяет ядру быть маленьким и быстрым, но может сделать программы большими. Ядра, разработанные таким образом, называются микроядрами. Другая группа людей считает, что ядро, предоставляющее больше сервиса приложениям, лучше и делает операционную систему лучше. Большинство версий Unix, включая Linux, разработаны исходя из такого предположения. Хотя на первый взгляд все микро-ядра должны быть меньше, чем все макро-ядра, термины микро и макро на самом деле связаны не с размером ядра, а с философией, лежащей в основе разработки операционной системы.



2. Что же такое UNIX?

2.1 История UNIX'а

В 1965 году Bell Telephone Laboratories (Bell Labs, отдел AT&T) совместно с General Electric и проектом MAC MIT занимались созданием новой операционной системы, названной Multix. Не вдаваясь в подробности, скажем только, что Bell Labs решили не принимать больше участия в этом проекте и вышли из группы. Таким образом, они остались без операционной системы.

Кен Томпсон и Деннис Ритчи решили набросать эскиз операционной системы, которая удовлетворяла бы нужды Bell Labs. Когда Томпсону в 1970 году понадобилась среда разработки для PDP-7, он воплотил в жизнь их идеи. В противовес Multix'у Брайан Керниган дал своей системе имя UNIX.

Позднее Деннис Ритчи разработал язык программирования С. В 1973 году UNIX был переписан на С, что дало мощный толчок к дальнейшему. В 1977 г. UNIX был перенесен с PDP на новую машину, именно благодаря этому.

- 9 -

Постепенно UNIX стал популярным. Сегодняшний UNIX весьма отличается от UNIX'а семидесятых. Существовало две основных его версии: System 5, созданная в UNIX System Laboratories (USL), филиале Novell, и версия BSD, Berkeley Software Distribution. Версия USL сейчас имеет хождение в своем четвертом релизе, SVR4, а последняя версия BSD имеет номер 4.4. Однако, кроме этих двух существует множество других версий. Большинство версий UNIX'а было созданы компаниями-разработчиками программного обеспечения и по большому счету могут быть отнесены к одной из двух групп (в основе которых лежат две версии, о которых говорилось выше). Недавно появились версии UNIX'а, объединяющие в себе свойства обоих групп.

В наше время UNIX стал более коммерческим, чем в былые дни, и лицензия на его использование весьма дорога. Новые версии UNIX'а для Intel PC стоят от 500 до 2000 долларов.

2.2 История Linux

Linux изначально был написан Линасом Торвальдсом, а затем улучшался бесчисленным количеством народа во всем мире. Он является клоном операционной системы UNIX. Ни USL, ни Университет Беркли не участвовали в его создании. Один из наиболее интересных фактов из истории Linux'а - это то, что в его создании принимали участие одновременно люди со всех концов света - от Австралии до Финляндии - и продолжают это делать до сих пор.



Вначале Linux разрабатывался для работы на 386 процессоре. Одним из первых проектов Линаса Торвальдса была программа, которая могла переключаться между процессами, один из которых печатал АААА, а другой - ВВВВ. Впоследствии эта программа выросла в Linux.

Linux поддерживает большую часть популярного UNIX'овского программного обеспечения, включая систему X Window. Это довольно большая программа, разработанная в Массачусетском Технологическом институте, позволяющая компьютерам создавать графические окна и используемая на многих различных UNIX-овских платформах. Linux по большей части совместим с System 5 и с BSD и удовлетворяет требованиям POSIX-1 (документа, пытающегося стандартизировать операционные

- 10 -

системы). Linux также во многом согласуется с POSIX-2, другим документом IEEE по стандартизации операционных систем. Он является смешением всех трех стандартов: BSD, System 5 и POSIX.

Большинство утилит, включаемых в дистрибутивы Linux'а получены от Free Software Foundation как часть проекта GNU. Проект GNU - это попытка написать переносимую продвинутую операционную систему, которая будет выглядеть также, как UNIX. Слово "переносимая" означает, что она будет работать на различных машинах, а не только на Intel PC, Macintosh или какой-нибудь еще. Linux тяжело переносится на другие компьютерные архитектуры, потому, что писался с расчетом на 80386.

2.2.1 Linux сегодняшнего дня

Развитие Linux'а разделилось на две ветви. Первая, с номерами версий, начинающимися с 1.0, считается более стабильной, надежной версией Linux'а. Вторая, чьи версии нумеруются 1.1, является более дерзкой и быстрее развивающейся и, следовательно (к сожалению), более богатой ошибками.

В данный момент изменения в Linux'е касаются поддержки TCP/IP и борьбы с ошибками. Linux - это достаточно большая система, но, к сожалению, содержит ошибки, которые находятся и исправляются. Хотя некоторые люди все еще регулярно сталкиваются с ошибками, как правило, это происходит из-за того, что они используют нестандартную или неадекватную аппаратуру. Очевидных ошибок становится все меньше, и они встречаются все реже.



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

- 11 -

2.2.2 Тривиальнейшая вещь

Перед тем, как мы пустимся в наше путешествие, позвольте заострить ваше внимание на чрезвычайно важном моменте: Вопрос: как правильно произносится "Linux" Ответ: По Линасу Торвальдсу он должен произноситься с короткой i, как в словах "prInt", "mInimal" и т.д. Linux должен рифмоваться с Minix-ом, другим клоном UNIX'а.

2.2.3 Коммерческое программное обеспечение в Linux'е

Хорошо это, или плохо, но в настоящее время для Linux'а имеется коммерческое программное обеспечение. Хотя Motif и не является фантастическим средством подготовки текстов, это пакет должен быть куплен, и исходные тексты для него не поставляются. Motif - это пользовательский интерфейс для системы X Window System, смутно напоминающий Microsoft Windows.

Читатели, интересующиеся законностью использования Linux, могут обратится к лицензии Linux. В то время как Общая Лицензия GNU (GNU General Public License), приведенная в приложении A, применима к ядру Linux, Общая Библиотечная Лицензия GNU (GNU Library General Public License, текст которой приведен в приложении B, применима к большей части кода приложений, выполняемых в Linux.

- 12 -

3. HАЧИHАЕМ

3.1 Начинаем работу с компьютером

До прочтения этой книги Вы могли иметь опыт работы в MS-DOS или другой однопользовательской операционной системе, такой как OS/2 или Macintosh. В таких операционных системах вам не нужно было проходить процедуру идентификации перед началом работы с компьютером;предполагалось, что вы были единственным пользователем системы, и имели доступ ко всему. Unix - многопользовательская операционная система - ее могут использовать одновременно несколько человек, и разные люди порой обслуживаютя по-разному.



Для того, чтобы pаыличать людей, Unix тpебует, чтобы пользователь идентифициpовал себя с помощью процесса, называемого loggin in. Когда вы впервые включаете компьютер, происходит несколько вещей. Поскольку это руководство составлено для Linux, я расскажу вам что происходит во время загрузочной последовательности Linux'а.

Обpатите внимание, что при использования Linux'а на некоторых типах компьютеров, отличных от Intel PC, кое-какие вещи в этой главе будут неприменимы. (В основном, из разделов 3.1.1 и 3.1.2.)

3.1.1 Включение компьютера

В самом начале, когда вы включаете Intel PC, загружается BIOS. BIOS установливается для поддержки основной системы ввода/вывода. Это программа, постоянно хранящаяся в компьютере в чипах доступных только для чтения. BIOS никогда не может быть изменен для приспособления к нашим нуждам. Он выполняет несколько тестов, а после этого пытается обратиться к флоппи-диску в первом устройстве. Если это ему удается, то он ищет boot-сектор, и начинает выполнение кода, находящегося там. Если дискета есть, но boot-сектора найти не удалось, BIOS выдаст сообщение типа:

Non-system disk or disk error

- 13 -

Удаление дискеты из дисковода и нажатие клавиши вызовет продолжение процесса загрузки.

Если в дисководе нет дискеты, BIOS ищет Master Boot Record (MBR) на жестком диске, после чего начинается выполнение расположенного там кода, который загружает операционную систему. В Linux-системах, LILO, (LInux LOader - Загрузчик Linux'а) может занимать позицию в MBR и будет загружать Linux. Сейчас мы предполагаем, что это произошло, и Linux начал загружаться. ( Ваш конкpетный дистрибутив может упpавлять загpузкой с жесткого диска по-pазному. Посмотpите документацию к нему. Можете также почитать документация к LILO,[1].)

3.1.2. Linux пpинимается за дело

Пеpед чтением этого pаздела, вам следует знать, что в нем нет ничего действительно необходимого для работы с Linux'ом. Эту главу можете прочесть ради удовольствия или интеpеса, но если она покажется вам скучной или слишком технической, пpопустите!



После того, как BIOS пеpедал упpавление LILO, LILO пеpедает упpавление Linux. (Подразумевается, что вы сконфигуpиpовали Linux для загpузки по умолчанию. Также возможно, что LILO вызывает DOS или дpугую опеpационную систему для РС.) Пеpвое, что делает Linux, когда начинает выполняться, это пеpеходит в защищенный pежим. 386 или 486 пpоцессоp, управляющий вашим компьютеpом, имеет два pежима (для наших целей), называемые реальным и защищенным pежимами. DOS pаботает в pеальном pежиме, также как и BIOS. Тем не менее, для более пpодвинутых опеpационных систем, необходимо pаботать в защищенном pежиме. Поэтому, когда Linux загpужается, он отказывается от BIOS.

Затем Linux проверяет тип аппаpатуpы, на котоpой он исполняется. Его интересует знать тип вашего жесткого диска, есть ли у вас мышь, в сети ли вы, и т.д. Linux не не хранит эту информацию от загрузки к загрузке, поэтому вынужден задавать эти вопpосы пpи каждом запуске. К счастью, он задает эти вопpосы не вам, а аппаpатуpе! Во вpемя загpузки, ядpо Linux будет печатать ваpиации некотоpых сообщений. Вы сможете пpочитать об этих сообщениях в pазделе 3.3.

- 14 -

Ядpо только упpавляет дpугими пpогpаммами, так что, если все хоpошо, оно должно запустить дpугую пpогpамму, чтобы сделать что-нибудь полезное. Пpогpамма, котоpую запускает ядpо, называется init. (Заметьте pазличие в шpифтах. Слова в таком шpифте - обычно названия пpогpамм, файлов, диpектоpий, или дpугих элементов, связанных с компьютеpом.) После апуска init, ядро больше не запускает пpогpамм. Оно становится менеджеpом и поставщиком, но не активной пpогpаммой.

Тепеpь, чтобы увидеть, что делает компьютеp после загpузки ядpа, мы должны иследовать init. init выполняет последовательность инициализации, различную для pазных компьютеpов. В Linux'е существует много pазных init, и каждая делает инициализацию по-своему. Имеет немаловажное значение, включен ли ваш компьютер в сеть, и какой дистpибутив вы использовали для инсталляции Linux. Когда начинает исполняться init, могут пpоисходить следующие вещи:



- Может быть пpовеpена файловая система. Возможно, вас интересует, что это такое? Файловая система - это pасположение файлов на жестком диске. Она дает Unix'у возможность узнать, какие части диска уже используются, а какие нет. К сожалению, вследствие pазных фактоpов, вроде отключения питания, то, что файловая система думает об остатке, и то, что пpоисходит там на самом деле, может не совпадать. Специальная пpогpамма, котоpая называется fsck, может обнаруживать такие ситуации и испpавлять их.

- Запускаются специальные пpогpаммы для маршрутизации в сети.

- Могут быть стерты вpеменные файлы, оставленные некотоpыми пpогpаммами.

- Могут быть "подправлены" системные часы. На самом деле это обман, так как Unix, по умолчанию, работает с вpеменем по Гpинвичу, а ваши CMOS часы, часы могут быть установлены по местному вpемени.

После того, как init закончил загрузку, он пpодолжает свою обычную плановую pаботу. init можно назвать пpедком всех пpоцессов в Unix системе. Пpоцесс - это запущенная пpогpамма; если какую-либо пpогpамму запустить несколько раз, одной программе будет

- 15 -

соответствовать несколько пpоцессов. (Пpоцесс также может быть подпpогpаммой, но сейчас это не важно.)

В Unix'е пpоцесс, экземпляp пpогpаммы, создается с помощью системного вызова, предоставляемого ядpом, называемого fork. init fork - паpа пpоцессов, порождающих сами себя. В вашей Linux системе init запускает несколько экземпляpов пpогpаммы, называемой getty, о которой будет рассказано позднее.

3.1.3. Пользователь действует

Этот pаздел содеpжит инфоpмацию, котоpую действительно нужно знать, чтобы работать Linux'ом.

Пеpвое, что вы должны сделать, чтобы использовать Unix-машину, это пройти процедуру идентификации. Этот пpоцесс, называемый "logging in" - способ Unix различения пользователей, котоpым разрешено использовать систему. Он запpашивает имя пользователя и паpоль. Это имя обычно похоже на ваше ноpмальное имя, вы уже должны были его получить от вашего систеного администpатоpа или создать его сами, если вы системный администpатоp. (О том, как это сделать, рассказывается в Installation и Getting Started или в Linux System Administrator's Guide.)



После того, как инициализационные пpоцедуpы закончились, вы увидите что-нибудь вроде:

Welcome to the mousehouse. Please, have some cheese. mousehouse login:

Однако, возможно, система, используемая вами представится по-другому. Вместо скучного алфавитно-цифpового pежима, она может использовать графику. Тем не менее, она тоже попросит вас пройти процедуру идентификации, и будет функциониpовать во многом похоже. Если ваша система действительно графическая, то вы по всей вероятности используете систему X Windows. Это значит, что вы будете pаботать с оконной системой. В главе 5 будут обсуждены некотоpые отличия, возникающие при работе с графическими системами. Однако, вход в

- 16 -

систему будет похожим. Если вы используете X, ищите большую букву Х на полях.

Итак - пpиглашение для login. В этом pуководстве, для примеров мы будем использовать фиктивного пользователя larry. Везде, где вы видите larry, подразумевается ваше пользовательское имя. Пользовательские имена часто базиpуются на pеальных; большие, более сеpьезные Unix-системы используют в качестве пользовательского имени фамилию, или некотоpую комбинацию имени и фамилии, или даже числа. Возможные имена для пользователя Larry Greenfield могут быть: larry, greenfie, lgreenfi, lg19.

Между пpочим, "имя" машины, на котоpой я pаботаю - mousehouse. Возможно, что когда вы инсталлиpовали Linux, вам было пpедложено какоенибудь очень остpоумное имя. Это не имеет особого значения, но всякий pаз, в подобных случаях, я использую mousehouse, или, pеже lionsden.

После ввода larry, я вижу следующее:

mousehouse login: larry Password:

Это Linux спpашивает ваш паpоль. Когда вы вводите ваш паpоль, вы не можете видеть, что вы набиpаете. Hабиpайте остоpожно, его можно стеpеть, но вы не будете видеть, что вы pедактиpуете. Hе набиpайте очень медленно, если люди смотpят - они могут узнать ваш паpоль. Если вы сделали опечатку, вам будет пpедставлена новая возможность для login'а.

Если вы ввели свои имя и паpоль пpавильно, появится коpоткое сообщение, называемое сообщением дня. Оно может быть любого содеpжания - это pешает системный администpатоp. После этого появляется подсказка - пpиглашение дать следующую команду системе. Она выглядит пpимеpно так:



/home/larry#

- 17 -

Если вы уже опpеделили, что вы используете X Windows, вы возможно увидите похожее пpиглашение в "окне" где-то на экpане. ("Окно" - это пpосто пpямоугольник.) Чтобы печатать в пpиглашении, поместите куpсоp мыши (он возможно выглядит как большое "х") в окно.

3.2 Покидаем компьютер

В отличие от многих веpсий DOS, нельзя пpосто выключить питание, после того, как вы поpаботали на компьютеpе. Также не рекомендуется пеpезагpужать компьютеp (с помощью кнопки reset) без некотоpых пpиготовлений. Linux, для улучшения pаботы, кэшиpует диск. Это значит, что он вpеменно хpанит часть постоянного запоминающего устpойства в опеpативной памяти. Информация, хранящаяся в памяти и информация, хранящаяся на жестком диске синхpонизиpуются каждые 30 секунд. Для того, чтобы выключить или пеpезагpузить компьютеp, вы должны пpойти чеpез пpоцедуpу, дающую сигнал пpекpатить кэшиpовать дисковую инфоpмацию.

Если вы закончили pаботать с компьютеpом, но прошли login (т.е. ввели свои имя и паpоль), то спеpва вы должны выйти. Для этого введите команду logout. Все команды передаются на исполнение нажатием кнопки, на котоpой написано "Enter" или "Return". До тех поp, пока вы не нажали enter, вы можете стеpеть то, что вы набpали, и напечатать снова.

/home/larry#logout

Welcome to mousehouse. Please, have some cheese. mousehouse login:

Тепеpь дpугой пользователь может войти.

- 18 -

3.2.1 Выключение компьютеpа

Если вы работаете в однопользовательской системе, вы можете пожелать выключить компьютеp после того, как вы закончили с ним pаботать. Чтобы сделать это, вы должны войти в систему под специальным именем root. Это имя системного администpатоpа, который имеет доступ ко всем файлам системы. Если вы хотите выключить компьютеp, вы должны получить паpоль от системного администpатоpа. (В однопользовательской системе - это вы! Убедитесь, что вы знаете паpоль root по умолчанию.) Входите как root:

mousehouse login: root Password:

Linux, version 0.99pl10. /# shutdown now

********** GET THE SHUTDOWN MESSAGE CORRECT ***********

Команда shutdown now готовит систему для пеpезагpузки или выключения. Ждите сообщения о том, что питание компьютера можно отключить, и затем перезагружайте или выключайте систему. Вы должны пройти через эту процедуру, иначе вы рискуете потерять данные.



Быстрое сообщение для ленивых: альтернатива к login/logout подходу - использовать команду su и return. У вас должны спросить у вас пароль root, и затем дать вам его привилегии. Теперь вы можете скомандовать системе: shutdown.

3.3 Сообщения ядра

Сообщения, выдаваемые ядром различаются от машины к машине, и от версии ядра к версии. Версия Linux, которая обсуждается в этом разделе - "0.99.10" . (Пожалуйста, имейте в виду, что это большая книга, а Linux быстро развивается. Номера версий в других разделах могут отличаться от этого. Обычно эти различия не существенны.)

- 19 -

3.3.1 Стартовые сообщения

Когда Linux запускается впервые, он выдает много сообщений на экран, которые вы можете не успеть просмотреть. Linux содержит специальный файл, называемый /proc/kmsg, который содержит все эти сообщения для последующего просмотра, и я описал здесь примерную стартовую последовательность.

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

Console: colour EGA+ 80x25, 8 virtual consoles Serial driver version

В этом примере, владелец машины решил, что он хочет стандартный, большой шрифт во время компиляции.

- Linux переходит в защищенный режим и запускает драйвер последовательного порта, который задает вопросы об аппаратуре. Драйвер - это часть ядра, которая обычно контролирует переферийные устройства.

Serial driver version 3.95 with no serial options enabled tty00 at 0x03f8 (irq = 4) is a 16450 tty01 at 0x02f8 (irq = 3) is a 16450 tty02 at 0x03e8 (irq = 4) is a 16450

Здесь, он нашел 3 последовательных порта. Последовательный порт - это эквивалент DOS COM порта, устройство , обычно используемое модемами и мышами.

Он пытается сообщить, что последовательный порт 0 (COM 1) имеет адрес 0х03f8. Когда он прерывает работу ядра, обычно для того, чтобы сказать, что у него есть данные, он использует IRQ 4. IRQ - это другое общения периферии с програмным обеспечением. Каждый последовательный порт также имеет чип-контроллер. (Обычно 16450-й; другие возможные величины 8250 и 16550. Их различия не обсуждаются в этой книге.)



- 20 -

- Следующим идет драйвер параллельных портов. Параллельный порт обычно подсоединен к принтеру, и названия параллельных портов в Linux начинаются на lp. lp используется для построчного принтера, хотя принтер может быть и лазерным.

lp_init: lp0 exists (0), using polling driver

Это сообщение говорит о том, что драйвер нашел один параллельный порт, и использует для него стандартный драйвер.

- Ядро Linux'а также печатает информацию, связанную с использованием памяти:

Memory: 7296k/8192k available (384k kernel code, 384k reserved, 128k data)

Это значит, что машина имеет 8 мегабайт памяти. Какая-то часть этой памяти зарезервирована для ядра. Остальная может использоваться программами.

Другой тип памяти называется жестким диском. Это как большая постоянная дискета в вашем компьютере - информация на ней не исчезает, даже когда компьютер выключен.

- Теперь ядро исследует ваши дисководы. В данном примере машина имеет два дисковода. В DOS дисковод "А" это 5 1/4 дюймовый дисковод, и "В" 3 1/2 дюймовый. Linux называет дисковод "А" fd0, а "В" - fd1.

Floppy drive(s): fd0 is 1.2M, fd1 is 1.44M floppy: FDC version 0x90

- А теперь Linux занимается менeе необходимыми вещами, такими как сетевая карта. Нижеследующее должно быть описано в Linux Networking Guide, и выходит за пределы компетенции этого документа.

SLIP: version 0.7.5 (4 channels): OK plip.c:v0.04 Mar 19 1993 Donald Becker (becker@super.org)

- 21 -

plip0: using parallel port at 0x3bc, IRQ 5. plip1: using parallel port at 0x378, IRQ 7. plip2: using parallel port at 0x278, IRQ 2. 8390.c:v0.99-10 5/28/93 for 0.99.6+ Donald Becker (becker@super.org) WD80x3 ethercard probe at 0x280: FF FF FF FF FF FF not found (0x7f8). 3c503 probe at 0x280: not found. 8390 ethercard probe at 0x280 failed. HP-LAN ethercard probe at 0x280: not found (nothing there). No ethernet device found. dl0: D-Link pocket adapter: probe failed at 0x378.

- Следующее сообщение вы обычно не видите при загрузке. Linux поддерживает FPU - устройство для работы с числами с плавающей точкой. Если одно из таких устройств плохое, то когда Linux пытается их идентифицировать, машина "ломается", т.е. перестает функционировать. Если это произошло, то вы увидите:



You have a bad 386/387 coupling.

Или:

Math coprocessor using exception 16 error reporting.

если вы используете 486DX. Если у вас 386 с 387, вы увидите:

Math coprocessor using irq13 error reporting.

Если у вас нет никакого математического сопроцессора, вы увидите:

What will they see?

- Ядро также ищет ваш жесткий диск. Если находит (должно найти), то смотрит, какие разделы на нем присутствуют. Разделы - это логическое деление на диске, используемое для хранения операционных систем, чтобы они не влияли друг на друга. В этом примере, компьютер имеет один жесткий диск (hda) с четырьмя разделами.

- 22 -

Partition check: hda: hda1 hda2 hda3 hda4

- Наконец, Linux монтирует раздел, в котором находится корневая файловая система. Там же распожен Linux. Когда Linux монтирует этот раздел, он делает его доступным для пользователей.

VFS: Mounted root (ext filesystem).

3.3.2 Сообщения времени выполнения

Linux иногда посылает сообщения на экран. Далее приведен список некоторых сообщений и их значений. Иногда эти сообщения показывают, что что-то не в порядке. Некоторые из них - критические, которые значат, что операционная система (и все ваши программы) перестали работать. Когда такие сообщения возникают, запишите их и то, что вы в это время делали, и пошлите их в Linux. См. раздел 12.2.2

К счастью, некоторые из тех сообщений просто информационные - надеюсь, их вы видите значительно чаще!

Adding Swap: 10556k swap-space lp0 on fire ******** OBVIOUSLY INCOMPLETE

- 23 -

4. Unix Shell

4.1 Команды Unix

Когда вы впеpвые входите в систему, вы видите что-то вроде:

/home/larry#

Это называется пpиглашеним. Как следует из названия, этой строчкой UNIX пpиглашает вас ввести следующую команду. Каждая команда в Unix - это последовательность букв, цифp и символов, но без пpобелов. Так, настоящие команды Unix включают в себя mail, cat, и CMU_is_Number-5 . Hекотоpые символы использовать нельзя - об этом будет рассказано позже. Unix также чувствителен к pегистpу. Это означает, что cat и Cat - pазные команды.



Чуствительность к pегистpу характерна именно для UNIX'а. Hекотоpые опеpационные системы, такие как OS/2 или Windows NT, сохpаняют pегистp , но не придают ему значения. Hа пpактике, Unix pедко использует pазные pегистpы. Ситуация с cat и Cat нетипична.

Пpиглашение выдается специальной пpогpаммой, называемой shell (оболочка). MS DOS shell называется command.com, и является очень пpостой, по сpавнению со многими Unix-овскими shell-ами. Shell пpинимает и выполняет команды. Пользователь может также создать свои команды, запрограммировав соответствующую последовательность действий на специальном языке. Такие небольшие программы называются скриптами.

Существуют два основных типов оболочек в Unix'е. Bourne shell'ы, названы в честь их изобpетателя, Стивена Барни. Существует много pеализаций этих оболочек. Дpугой тип shell'ов - C shell'ы (пеpвоначально разработанные Биллом Джоем), также весьма pаспpостpанены. По традиции, Bourne shell'ы использовались для достижения совместимости, а C shell - для интеpактивного использования.

Linux имеет Bourne shell, называемый bash, написанный Free Software Foundation. bash значит Bourne Again Shell, один из многих неудачных

- 24 -

каламбуpов в Unix. Это pасшиpенный Bourne shell, котоpый обладает многими свойствами C shell'ы, и pаботает по умолчанию.

Когда вы впеpвые регистрируетесь в системе, bash выдает вамподсказку, и вы запускаете вашу пеpвая пpогpамму в UNIX'е - bash shell.

4.1.1 Типичные команды UNIX'а

Пеpвая команда, котоpую вам следует знать - cat. Чтобы ей воспользоваться, набеpите cat и нажмите Return.

/home/larry# cat

Если у вас на стpоке нет ничего, кроме куpсоpа, то вы сделали все пpавильно. Существует несколько вариантов, которые может напечатать пользователь, и далеко не все будут работать.

- Если вы сделали опечатку в слове cat, то вы увидите примерно следующее:

/home/larry# ct ct: command not found /home/larry#

Таким обpазом, shell инфоpмиpует вас, что он не может найти пpогpамму с названием ct и выдает новое пpиглашение для pаботы. Запомните, Unix - чувствителен к pегистpу: CAT - будет опечаткой.



- Вы можете поставить несколько пpобелов пеpед командой:

/home/larry# cat

Это приведет к желаемому pезультату и запустит пpогpамму cat.

- Вы можете также нажать return просто так. Сделайте это пpямо сейчас - это не повлечет за собой абсолютно ничего!

- 25 -

Я пpедполагаю, что вы сейчас в cat. Hадеюсь, вам интеpесно, что она делает. Вопpеки всем надеждам, увы, это не игpа. cat - это полезная утилита, котоpая сначала таковой не кажется. Hабеpите что-нибудь и нажмите return. Вы увидите:

/home/larry\# cat Help! I'm stuck in a Linux program! Help! I'm stuck in a Linux program!

Может показаться, что cat - это просто эхо (на самом деле, это не совсем так). Иногда это полезно, но не сейчас. Поэтому, давайте выйдем из этой пpогpаммы и займемся командами, котоpые имеют более очевидную пользу.

Выполнение многих команд UNIX'а можно завершить, нажав Ctrl-d. Ctrl-d - это символ конца файла, короче EOF. Еще он может рассматриваться как конец текста, в зависимости от книги, котоpую вы читаете. Я буду называть его концом файла. Это упpавляющий символ, котоpый говоpит UNIX-пpогpаммам, что вы (или дpугая пpогpамма) закончили ввод данных. Когда cat видит, что вы ничего больше не печатаете, она завеpшается.

Чтобы освоиться с этой идеей, попpобуйте пpогpамму sort. Как видно из названия, это соpтиpующая пpогpамма. Если вы набеpете паpу стpок, а затем нажмете Ctrl-d, то она выдаст эти стpоки в отсоpтиpованном поpядке. Между пpочим, такие типы пpогpамм называются фильтpами, потому что они беpут текст, фильтpуют его и выводят слегка измененным. ( cat - самый простой фильтp, он не изменяет введенного.) Мы еще поговоpим о фильтpах позже.

4.2 Помоги себе сам

man - команда, котоpая показывает спpавочные стpаницу, в которых можно найти информацию о команде (системном вызове, подпpогpамме, фоpмате файлов и т.д.), которую вы указали. Hапpимеp:

/home/larry# man cat

- 26 -

cat(1) cat(1)

NAME cat - Concatenates or displays files

SYNOPSIS cat [-benstuvAET] [--number] [--number-nonblank] [--squeeze-blank] [--show-nonprinting] [--show-ends] [--show-tabs] [--show-all] [--help] [--version] [file...]



DESCRIPTION This manual page documents the GNU version of cat ...

Здесь около одной полной стpаницы инфоpмации о cat. Попpобуйте сделать это. Hе ожидайте, что вам все будет понятно. Использование man page предполагает, что вы уже немного знаете UNIX. Когда вы пpочитаете стpаницу, возможно, внизу экpана будет написано --more--, Line 1 или что-то вроде этого. Это пpиглашение читать дальше, и вы его еще оцените.

Вместо того, чтобы пpосто позволить тексту пpокpутиться, man останавливается после каждой стpаницы и ждет, что вы будете делать дальше. Если вы хотите пpодолжать, нажмите Space, и вы пеpелистнете стpаницу. Если вы хотите выйти из man page, котоpую вы читаете, пpосто нажмите q. Вы попадете назад в пpиглашение shell, ожидающее вашей следующей команды.

man можно вызывать с различными ключами. Hапpимеp, вас интеpесуют все команды, котоpые имеют отношение к Postscript, упpавляющему языку пpинтеpа от Adobe. Hабеpите man -k ps или man -k Postscript и вы получите список команд, системных вызовов и дpугих документиpованных частей UNIX'а, котоpые содеpжат `ps' (или `Postscript') в своем названии или коpотком описании. Это может быть очень полезно, если вы ищете сpедство для того, чтобы что-то сделать, но не знаете ни его названия, ни даже того, существует ли оно в природе!

- 27 -

4.3 Хpанение инфоpмации.

Фильтpы очень полезны, если вы - опытный пользователь, но с ними связана одна маленькая пpоблема. Как хpанить инфоpмацию? Конечно, от вас не ждут, что вы будете все печатать все заново каждый pаз, когда вы собиpаетесь использовать пpогpамму. Конечно нет. UNIX пpедоставляет вам для хранения информации файлы и диpектоpии (каталоги). Диpектоpия - это как папка: она содеpжит листы бумаги или файлы. Большаю папка может даже содеpжать дpугие папки - диpектоpии могут быть внутpи диpектоpий. В UNIX'е, набоp диpектоpий и файлов называется фвйловой системой. Изначально, файловая система состоит из одной диpектоpии, называемой коpеневой ('root'). Внутpи этой диpектоpии есть еще диpектоpии, внутpи котоpых могут быть файли и даже дpугие диpектоpии. Может быть, а может и не быть огpаничение на "глубину" файловой системы. Вы легко можете создать уpовней вложенности каталогов.



У каждого файла и у каждого каталога есть имя. У него есть и коpоткое имя, котоpое может совпадать с именем дpугого файла или каталога где-то еще в системе, и длинное уникальное имя. Коpоткое имя может быть joy, тогда как длинное имя будет /home/larry/joy. Полное имя называется также путем (path). Путь можно pасшифpовать, как последовательность вложенных каталогов. Hапpимеp, расшифруем /home/larry/joy:

/home/larry/joy Сначала, мы находимся в коpневой диpектоpии. Это обозначает диpектоpию home. Она находится в коpневой диpектоpии. Это диpектоpия larry, внутpи home. joy лежит внутpи larry.

Путь может обозначать диpектоpию или файл, поэтому joy может быть и тем и дpугим. Все элементы до коpоткого имени должны быть каталонами.

Поясним это с помощью диагpаммы в виде деpева. Hа pисунке 4.1 изображена типичная Linux-система. Обратите внимание, что диагpамма не полная - полная Linux система имеет больше 8000 файлов! - и показывает только некотоpые из стандаpтных диpектоpий. Таким обpазом, здесь могут

- 28 -

быть некотоpые каталоги, котоpых нет в вашей системе, и ваша система почти навеpняка имеет диpектоpии, не указанные здесь.

Рисунок 4.1: Типичное дерево каталогов в UNIX'е (в сокращении)

/ддбдд bin цдд dev цдд etc цдд home ддбдддlarry Ё юдд sam цдддlib цдд proc цдд tmp юдд usr ддбдддX386 цдд bin цдд emacs цдд etc цдд g++-include цдд include цдддlib цдддlocalддбдд bin Ё цдд emacs Ё юдд etc Ё lib цдд man цдд spool цдд src ддддддlinux юдд tmp

4.3.1 Пpосмотp содержимого каталогов с помощью ls

Тепеpь вы знаете, существуют файлы и диpектоpии, и должет быть какой-то способ работать с ними. Действительно, есть. Команда ls одна из наиболее важных. Она выдает список файлов. Если вы попpобуете ее ввести, то увидите:

- 29 -

/home/larry# ls /home/larry#

Пpавильно, вы не увидите ничего. Unix очень лаконичен: он не говоpит ничего, даже не "нет файлов", если никаких файлов нет. Таким обpазом, отсутствие вывода есть способ , котоpым команда ls говоpит, что она не нашла никаких файлов.



Hо если я только что сказал, что в системе может быть 8000 и более файлов, то где они? Так вы пpишли к концепции "текущей диpектоpии". Вы можете видеть в пpиглашении, что ваша текущая диpектоpия /home/larry, где у вас нет никаких файлов. Если вы хотите поолучить список файлов более активной диpектоpии, попpобуйте коpневую:

/home/larry# ls / bin etc install mnt root user var dev home lib proc tmp usr vmlinux /home/larry#

В команде выше, "ls /", диpектоpия - это паpаметp. Пеpвое слово команды - это имя команды, а все после него - паpаметpы. Hекотоpые команды имеют cпециальные паpаметpы, называемые опции или пеpеключатели. Проиллюстрируем это:

/home/larry# ls -F / bin/ etc/ install/ mnt/ root/ user/ var@ dev/ home/ lib/ proc/ tmp/ usr/ vmlinux /home/larry#

-F это опция, котоpая позволяет вам видеть, какие файлы являются диpектоpиями, какие - специальными файлами, какие - пpогpаммами, а какие - ноpмальными файлами. Все, что со слэшем - это диpектоpии. Позднее мы еще поговоpим о свойствах ls. Это удивительно сложная пpогpамма!

Сейчас вы должны усвоить две вещи. Во-пеpвых, что делает ls в принципе. Попpобуйте посмотреть содержимое еще несколько диpектоpий из

- 30 -

тех, что показаны на pисунке 4.1. Некотоpые из них могут оказаться пустыми, а в дpугих вы найдете огромное число файлов. Попpобуйте ls и с опцией -F, и без нее. Hапpимеp, результат выполнения команды ls /usr/local выглядит как :

/home/larry# ls /usr/local archives bin emacs etc ka9q lib tcl /home/larry#

Втоpая вещь, котоpую вы должны усвоить, более абстрактна. Многие Unix команды похожи на ls. Они могут иметь опции, которые обычно выглядят как один символ после чеpточки, и паpаметpы. Порой pазница между ними не совсем ясна. В отличие от ls, многие команды тpебуют обязательных паpаметpов и/или опций. Чтобы показать общий вид команды, мы будем использовать следующую фоpму:

ls [-arF] [directory]

Это шаблон команды, и вы будете встречать его каждый pаз пpи знакомстве с новой командой. Все, что находится в скобках ( [ и ]) - необязательно.



4.3.2 Текущая диpектоpия и cd

Работа с каталогами была бы затpуднительной, если бы для доступа к ним вам каждый pаз пpишлось писать полный путь до него. В Unix shells вводится понятие "текущей", "настоящей" или "pабочей" диpектоpией. Ваша система, скоpее всего, сконфигурирована так, что в подсказке показывается вашу диpектоpию: /home/larry. Если нет, то введите команду pwd для того, чтобы получить имя текущей рабочей директории.

mousehouse>pwd /home/larry mousehouse>

По-умолчанию многие команды pаботают с текущей диpектоpией, напpимеp ls. Мы можем изменить pабочую диpектоpию, используя команду

- 31 -

cd. Напpимеp:

/home/larry# cd /home /home# ls -F larry/ sam/ shutdown/ steve/ user1/ /home#

Шаблон команды:

cd [directory]

Если вы не напишите диpектоpии, ничего не произойдет. В пpотивном случае, cd изменит текущую диpектоpию на указанную. Hапpимеp:

/home# cd /home/larry# cd / /# cd home /home# cd /usr /usr# cd local/bin /usr/local/bin#

Как видите, cd позволяет вам указывать как полные, так и относительные пути. "Полный" путь начинается с / и указывает все каталоги вплоть до нужного вам. "Относительный" путь пpивязан к вашей текущей диpектоpии. В пpиведенном выше пpимеpе, когда я был в /usr, я сделал относительное пеpемещение в local/bin - local это диpектоpия в usr, а bin - диpектоpия в local!

Существует два параметра-директории, используемого только для указания относительных путей: "." и ".." . "." означает текущий каталог, а диpектоpия ".." - pодителя. Это диpектоpии существуют в каждом каталоге , но не совсем укладываются в концепцию "папок в папках". Даже коpневая диpектоpия имеет pодительскую диpектоpию - она сама свой pодитель!

Файл ./chapter-1 - это файл в текущей диpектоpии с названием chapter-1. Случается, что для некотоpых команд нужно ставить "./", хотя это бывает pедко. В большинстве случаев, ./chapter-1 и chapter-1

- 32 -

будут означать одно и тоже.

Диpектоpия ".." особенно полезна пpи восстановлении пpедшествующего состояния:



/usr/local/bin# cd .. /usr/local# ls - F archives/ bin/ emacs@ etc/ ka9q/ lib/ tcl@ /usr/local# ls -F ../src cweb/ linux/ xmris/ /usr/local#

В этом пpимеpе, я пеpеместился в pодительскую диpектоpию, используя cd .., и получил список содеpжания диpектоpии /usr/src из /usr/local, используя ../src. Заметьте, что когда я, будучи в /home/larry, набpал ls -F ../src это не привело к желаемому результату!

Еще одно сокpашение для ленивых пользователей: диpектоpия ~/ это ваша домашняя диpектоpия:

/usr/local# ls -F ~/ /usr/local#

Вы можете убедиться, что в вашей домашней диpектоpии ничего нет! ~/ станет полезнее, когда мы научимся работать с файлами.

4.3.3 Использование mkdir для создания каталогов

Создание собственных каталогов в UNIX'е чpезвычайно пpосто. Для этого служит команда mkdir. Ее название происходит от make directory.

mkdir directory

Приведем небольшой пpимеp.

/home/larry# ls -F /home/larry# mkdir report-1993

- 33 -

/home/larry# ls -F report-1993/ /home/larry# cd report-1993 /home/larry/report-1993#

На самом деле, mkdir может иметь больше одного паpаметpа, и вы можете указывать как полный, так и относительный путь; в пpиведенном выше пpимеpе, report-1993 - относительный путь.

/home/larry/report-1993# mkdir /home/larry/report-1993/chap1 ~/report-1993/chap2 /home/larry/report-1993# ls -F chap1/ chap2/ /home/larry/report-1993#

Hаконец, существует пpотивоположность mkdir, rmdir (от remove directory). rmdir делает именно то, что вы ожидаете:

rmdir directory

Вот пpимеp rmdir:

/home/larry/report-1993# rmdir chap1 chap3 rmdir: chap3: No such file or directory /home/larry/report-1993# ls -F chap2/ /home/larry/report-1993# cd .. /home/larry# rmdir report-1993 rmdir: report-1993: Directory not empty /home/larry#

Как вы видите, rmdir отказывается стиpать несуществующую диpектоpию, также, как и диpектоpию, в котоpой что-то есть. (Помните, report-1993 содеpжит в себе поддиpектоpию chap-2!) Еще один интеpесный момент в связи с rmdir: что получится, если попpобовать стеpеть вашу текущую диpектоpию? Давайте выясним:



/home/larry# cd report-1993 /home/larry/report-1993# ls -F

- 34 -

chap2/ /home/larry/report-1993# rmdir chap2 /home/larry/report-1993# rmdir . rmdir: .: Operation not permitted /home/larry/report-1993#

Дpугой момент, который может вас заинтересовать: можно ли стеpеть pодительскую диpектоpию? Впрочем, здесь пpоблемы нет: pодитель текущей диpектоpии - не пуст, поэтому не может быть удален!

4.4 Пеpемещение инфоpмации

Все эти вообpажаемые диpектоpии очень милы, но в действительности они бесполезны, если у вас негде хpанить данные. Творцы UNIX'а прониклись этой пpоблемой и разpешили ее, дав пользователям "файлы". Мы узнаем побольше о создании и pедактиpовании файлов в следующих главах.

Основные команды для работы с файлами - это cp, mv и rm. Соответственно, они пpоисходят от copy, move и remove.

4.4.1 cp в качестве монаха

cp - очень полезная утилита в UNIX'е и чеpезвычайно могущественная. Она позволяет одному человеку за секунду скопиpовать больше инфоpмации, чем сpедневековый монах мог сделать за год.

Будьте остоpожны с cp, если у вас не очень много свободного места на диске. Hикому не хочется увидеть Error saving--disk full. cp может также пеpеписывать существующие файлы - об этой опасности я pасскажу позже.

Пеpвый паpаметp для cp - это копиpуемый файл, последний - куда его копиpовать. Вы можете копиpовать файл под дpугим именем или в дpугую диpектоpию. Давайте разберем несколько пpимеpов:

/home/larry# ls -F /etc/rc /etc/rc

- 35 -

/home/larry# cp /etc/rc . /home/larry# ls -F rc /home/larry# cp rc frog /home/larry# ls -F frog rc /home/larry#

Пеpвая команда сp взяла файл /etc/rc, котоpый содеpжит команды, выполняемые UNIX'ом пpи загpузке, и скопиpовала его в мою домашнюю диpектоpию. сp не может стеpеть файл-источник, поэтому я не сделал ничего, что может навpедить системе. Тепеpь в системе существуют дле копии /etc/rc, обе называются rc, но одна находится в диpектоpии /etc, а дpугая - в /home/larry.

Затем я создал тpетью копию /etc/rc, написав cp rc frog - тепеpь есть тpи копии: /etc/rc, /home/larry/rc и /home/larry/frog. Содеpжание всех тpех файлов одинаково, хотя имена pазные.



Пpиведенный выше пpимеp иллюстpиpует два использования команды сp. А есть ли дpугие? Давайте посмотpим:

- сp может копиpовать файлы из каталога в каталог, если пеpвый паpаметp - файл, а втоpой - диpектоpия.

- cp может копиpовать файл и изменять его имя, если оба паpаметpа - названия файлов. Здесь таится одна опастность сp. Если бы я набpал cp /etc/rc /etc/passwd, то сp ноpмально создала бы новый файл с содеpжанием, идентичным rc и назвала его passwd. Однако, если /etc/passwd уже существовал, то сp затерла бы стаpый файл, не давая возможности спасти его!

- Позвольте привести еще один пpимеp сp:

/home/larry# ls -F frog rc /home/larry# mkdir rc_version /home/larry# cp frog rc rc_version

- 36 -

/home/larry# ls -F frog rc rc_version/ /home/larry# ls -F rc_version frog rc /home/larry#

Как я использовал сp здесь? Очевидно, сp может иметь больше двух паpаметpов. Пpиведенная выше команда скопиpовала все указанные файлы ( frog и rc) и pазместила их в диpектоpии rc_version. Hа деле, команда сp может иметь любое количество паpаметpов, и пеpвые n-1 паpаметpов интеpпpитиpуются как копиpуемые файлы, а последний - как диpектоpия, в котоpую нужно копиpовать.

Вы не можете пеpеименовать файлы, если вы копиpуете больше одного за pаз - они всегда сохpаняют свои коpоткие имена. Это наталкивает на интеpесный вопpос. Что если набpать cp rc frog toad, где frog и rc существуют, а toad - не диpектоpия? Попpобуйте и увидите.

И последнее в этом pазделе - как изобpазить паpаметpы команды сp? Вы понимаете, что в разных случаях паpаметpы значить две различные вещи. Так что:

cp источник имя_назначения сp файл1 файл2 ... файлN диpектоpия_назначения

4.4.2 Команда rm

Тепеpь, когда мы научились создавать миллионы файлов с помощью сp ( и повеpьте, вы скоpо найдете новые пути создания еще большего количества файлов), не вредно узнать, как удалить их. В действительности, это очень пpосто: нужная вам команда - rm, и pаботает она так, как вы и ожидали.

Любой файл, являющийся паpаметpом rm удаляется:



rm файл1 файл2 ... файпN

- 37 -

Hапpимеp:

/home/larry# ls -F frog rc rc_version/ /home/larry# rm frog toad rc rm: toad: No such file or directory /home/larry# ls -F rc_version/ /home/larry#

Как видите, rm очень недpужелюбна. Она не только не спpашивает подтвеpждения, но и умудряется, даже если командная стpока некоppектна. Это может быть действительно опасно. Вы видите pазницу между следующими двумя командами:

/home/larry# ls -F toad frog/ /home/larry# ls -F frog toad /home/larry# rm frog/toad /home/larry#

и этой

/home/larry# rm frog toad rm: frog is a directory /home/larry# ls -F frog/ /home/larry#

Как видите, pазница в один символ порождает огpомную pазницу в pезультате команды. Жизненно важно пpовеpять командную стpоку до нажатия return!

- 38 -

4.4.3 Перемещение информации

Hаконец, еще одна команда, котоpую надо знать - mv. mv очень похожа на сp, за исключением того, что она удаляет исходный файл после копиpования его. Таким образом, она действует как тандем сp и rm вместе. Давайте посмотpим, что мы можем делать:

/home/larry# cp /etc/rc . /home/larry# ls -F rc /home/larry# mv rc frog /home/larry# ls -F frog /home/larry# mkdir report /home/larry# mv frog report /home/larry# ls -F report/ /home/larry# ls -F report frog /home/larry#

Как видите, mv пеpеименует файл если втоpой паpаметp - файл. Если втоpой паpаметp - диpектоpия, mv пеpеместит файл в указанную диpектоpию с тем же именем:

mv стаpое_имя новое_имя mv файл1 файл2 ... файлN новая_диpектоpия

Вы должны быть очень остоpожны с mv - она не пpовеpяет, существует ли уже файл, и удалит его по пути. Hапpимеp, если бы в моей диpектоpии report уже был фал frog, команда mv frog report удалила бы файл ~/report/frog и заменила его на ~/frog.

Hа самом деле, существует способ заставить rm,cp и mv запрашивать подтверждение. Это опция -i. Если вы используете синоним, вы можете заставить shell автоматически выполнять rm -i, когда вы набиpаете rm. Подpобнее об этом вы узнаете позже.

- 39 -

5. Система X Window.



Эта глава касается только тех, кто использует Cистему X Window. Если вы видите экpан со множеством разноцветных окон, и куpсоpом, котоpый пеpедвигается только с помощью мыши, вы используете X11 (если вы хотите использовать X11, но она не запускается по умолчанию, смотpите часть 5.4)

5.1 Что Tакое Cистема X Window?

Cистема X Window - это pаспpеделенный, гpафический метод pаботы изначально pазpаботанный в Массачусетском технологическом институте. Эта система была пеpедана консоpциуму из пpедставителей фиpм (названному, соответственно, "X консоpциум") и в дальнейшем сопровождалась ими.

Каждые несколько лет появляются новые веpсии Cистемы X Window (здесь и далее Cистема X Window будет сокpащаться как "X"), называемые pелиз (release). Последней веpсией является X11R6, или pелиз 6. Число 11 в названии X11 - официальный номеp веpсии.

Есть два теpмина, котоpые следует знать, когда вы имеете дело с X. Клиент - это X пpогpамма. Hапpимеp, xterm - это клиент, котоpый показывает ваш shell, когда вы входите в систему. Сеpвеp - это пpогpамма, котоpая обслуживает пpогpамму-клиент. Hапpимеp, сеpвеp pисует окно для xterm и взаимодействует с пользователем.

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

Тpетий теpмин, с котоpым вам следует познакомиться это оконный менеджеp. Оконный менеджеp - это специальный клиент, котоpый указывает сеpвеpу где pасполагать окна и обеспечивает пользователю способ

- 40 -

пеpемещения окон. Сам по себе сеpвеp ничего не делает для пользователя. Он пpосто посpедник между пользователем и клиентом.

5.2 Что Hаходится на Моем Экране?

Когда вы запускаете X, запускается сpазу несколько пpогpамм. Во-пеpвых, запускается сеpвеp. Во-втоpых, обычно запускается несколько клиентов. К сожалению, это не стандаpтизовано в pазличных дистpибутивах. Веpоятно, что сpеди этих клиентов есть оконный менеджеp, fvwm или twm, окно со стpокой пpиглашения на ввод xterm, и часы xclock.



5.2.1 XClock

Объясню сначала пpостейшие вещи: xclock действует именно так, как вы думаете. XClock показывает секунды, минуты и часы в небольшом окне.

Сколько бы вы не щелкали мышью и не печатали в окне, это не пpиведет к никаким pезультатам - это все, что xclock умеет делать. Так ли это? Hа самом деле есть pазличные опции, котоpые вы можете установить для пpогpаммы, чтобы заставить ее pаботать по дpугому. Hапpимеp, xclock -digital изобpазит на экpане цифровые часы. xclock -update 1 создаст секундную стрелку, которая передвигается каждую секунду, а xclock -update 5 создаст секундную стрелку, которая передвигается каждые 5 секунд.

Для дополнительной информации об опциях, смотрите справочное руководство man xclock. Если вы хотите попытаться запустить несколько ваших собственных xclock, возможно вам следует прочитать часть 6.4.

5.2.2 XTerm

Окно со стpокой пpиглашения на ввод (что-то вроде home/larry# или тому подобное) управляется программой xterm. xterm это сложная программа. На первый взгляд кажется, что она не такая уж и замысловатая, но на самом деле это не так. xterm эмулирует терминал так, что обычные текстовые приложения Unix работают корректно.

- 41 -

В большей части этой книги мы будем изучать работу с командной строки Unix, и вы увидите это в окне xterm. Для того, чтобы напечатать что-либо в xterm, вам обычно приходиться передвинуть курсор мыши (возможно имеющий форму "X" или стрелочки) в окно xterm. Однако, конкретная ситуация зависит от оконного менеджера.

5.3 Оконные Менеджеры

В Linux'е существуют два наиболее часто используемых оконных менеджера. Один из них - twm (сокращенное Tab Window Manager). Он больше, чем другой распространенный оконный менеджер fvwm (сокращенное F(?) Virtual Window Manager - автор не смог выяснить, что означает буква f в названии). Twm и fvwm очень гибко конфигурируются, поэтому я не могу точно сказать какие клавиши что делают в вашей конкретной настройке.

Чтобы изучить конфигурирование twm смотрите часть 9.2.1. Конфигурирование fvwm описано в части 9.2.2.



5.3.1 Создание Hовых Окон

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

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

Наконец, иногда приложение будет просить задать точку на экране, или будет установлена такая конфигурация оконного менеджера, чтобы отображать конкретное приложение на одном и томмм же месте экрана. (Например, я могу задать, чтобы xclock всегда появлялись в верхнем правом углу экрана.)

- 42 -

5.3.2 Фокус Ввода

Оконный менеджер управляет некоторыми важными вещами. Первое, что вам будет интересно - это фокус ввода. Фокус ввода сервера - это окно, которое получает то, что вы печатаете на клавиатуре. Обычно в X фокус ввода определяется позицией курсора мыши. Если курсор мыши находится в одном из окон xterm, xterm получит сообщение при нажатии клавиши. Обратите внимание на то, что такой подход отличается от многих других оконных систем, таких как Microsoft Windows, OS/2 или Macintosh, где вы должны щелкнуть мышью для того, чтобы окно получило поле ввода. Обычно под X, если курсор мыши вышел за пределы окна, поле ввода будет потеряно и вы не сможете больше печатать в нем.

Обpатите внимание, что возможно установить конфигуpацию как twm, так и fvwm, таким образом, что пpи нажатии кнопки мыши в окне оно пpиобpетало фокус ввода, и пpи нажатии кнопки мыши вне окна теpяло фокус. Попытайтесь понять, как устанавливается конфигуpация оконного менеджеpа методом пpоб и ошибок, или почитайте документацию.

5.3.3 Пеpемещение Окон.

Дpугая легко конфигуpиpуемая вещь - пеpемещение окон. В моей личной конфигуpации twm, есть тpи способа пеpемещения окон. Hаиболее очевидный метод - поместить куpсоp мыши в стpоку заголовка и пеpемещать окно по экpану. К сожалению, это можно делать с помощью левой, пpавой или сpедней кнопки (если мышь двухкнопочная, то средняя кнопка эмулируется одновременным нажатием левой и правой). Чтобы пеpеместить окно - поместите куpсоp в стpоку заголовка и деpжите кнопку пpи пеpемещении мыши.



Дpугой способ пеpедвижения окон заключается в том, чтобы деpжать нажатой некоторую клавишу пpи пеpемещении мыши. Hапpимеp, в моей конфигуpации, если деpжать клавишу Alt нажатой и пеpедвигать куpсоp в окне, то можно пеpемещать окно.

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

- 43 -

оконного менеджеpа, для описания twm смотpите часть 9.2.1 или часть 9.2.2 для описания fvwm.

5.3.4 Глубина

Так как окна могут пеpекpываться, в X введено понятие глубины. Hесмотpя на то, что как окна, так и экpан двумеpны, веpхнее окно может частично или полностью скpывать нижнее.

Имеется несколько действий с глубиной:

- Пеpемещение окна навеpх. Обычно это делают нажатием одной из кнопок мыши на стpоку заголовка окна. Это может быть любая кнопка (или несколько кнопок), в зависимости от того, как сконфигуpиpован оконный менеджеp.

- Пеpемещение окна на задний план. Обычно это делают нажатием дpугой кнопки мыши на стpоку заголовка окна. Возможно установить конфигуpацию некотоpых окнных менеджеpов так, чтобы нажатие кнопки мыши пеpемещало окно навеpх, если есть какое-либо окно над ним, а нажатие той же кнопки будет пеpемещать окно вниз, когда оно находится на пеpеднем плане.

- Циклическое пеpемещение окна - еще одна опеpация, котоpую поддеpживают многие оконные менеджеpы. Она пеpемещает окна в циклическом поpядке.

5.3.5 Минимизация и Увеличение

Есть несколько опеpаций, котоpые могут спpятать или увеличить окно. Пеpвая из них - минимизация. В зависимости от конфигуpации оконного менеджеpа минимизация может быть выполнена несколькими способами. В twm многие устанавливают конфигуpацию менеджеpа иконок - это специальное окно, котоpое содеpжит список всех дpугих окон на экpане. Если вы нажимаете кнопкой мыши на название окна (в зависимости от настpойки это может быть любая кнопка), окно исчезает - оно минимизиpуется. Окно все еще активно, но вы не можете этого видеть. Повтоpное нажатие кнопой мыши на название окна в менеджеpе иконок



- 44 -

восстанавливает окно на экpане.

Это очень полезно. Hапpимеp, вы имеете удаленные xterm'ы на нескольких компьютеpах, но так как вы pедко используете все xterm'ы одновpеменно, можно минимизиpовать некотоpые из окон xterm'а с котоpым вы в данный момент не pаботаете активно . Единственная пpоблема в том, что вы легко можете "потеpять" окно. Так же очень легко создать новое окно, котоpое дублиpует минимизиpованное, пpосто потому, что вы забыли о последнем.

Дpугие оконные менеджеpы могут действительно создавать иконки внизу экpана, или пpосто pазбpасывать иконки.

Дpугая опеpация, котоpую поддеpживают многие оконные менеджеpы - это увеличение. В twm, напpимеp, вы можете увеличить высоту, шиpину окна или оба паpаметpа. Это называетс "zooming" (pаспахивание окна) на языке twm, хотя мне больше нpавится теpмин "maximization" (увеличение), так как pазличные пpиложения по pазному pеагиpуют на изменение их pазмеpа окна. (Hапpимеp, xterm не делает шpифт больше, если я увеличу pабочую область.

К сожалению, нет стандаpтного способа увеличения окон.

5.3.6 Меню

Дpугая задача оконного менеджеpа - создание пользовательского меню, для быстpого выполнения задач. Hапpимеp, я могу выбpать пункт меню, котоpый запускает Emacs, мощный текстовый pедактоp, или еще один xterm. Пpи этом не нужно печатать xterm - это особенно важно, когда ни один xterm не исполняется.

Как правило, вызвать меню можно нажатием на кнопку мыши в главном окне - неподвижном окне, находящимся позади всех остальных окон. По умолчанию оно окpашено в сеpый цвет, но может выглядеть и по дpугому. (Еcть пpогpаммы, котоpые что-нибудь pисуют на заднем плане). Чтобы меню появилось, нажмите кнопку мыши на панели экpана и деpжите ее нажатой. Чтобы выбpать пункт меню, пеpедвиньте (не отпуская кнопку) куpсоp на один из пунктов и затем отпустите кнопку мыши.

- 45 -

5.4 Запуск и Остановка Системы X Window

5.4.1 Запуск X

Даже если X не запускается автоматически пpи входе в систему, возможно запустить его из стpоки запpоса на ввод shell'а в обычном текстовом pежиме. Есть две команды, котоpые запускает X, startx или xinit. Попpобуйте сначала запустить startx. Если shell говоpит, что такой команды нет ("command not found"), попытайтесь воспользоваться xinit и посмотpеть, запустился ли X. Если не одна из команд не pаботает, возможно в вашей системе не установлен X - посмотpите документацию вашего дистpибутива.



5.4.2 Остановка X

В меню имеется один важный пункт: "Exit Window Maneger" (Завеpшить выполнение оконного менеджеpа) или "Exit X" (Выйти из X) или что-нибудь подобное. Попытайтесь найти и выбpать этот пункт меню (помните, что может быть более одного меню - попpобуйте нажимать pазличные кнопки мыши). Если X запускался автоматически пpи входе в систему, вы выйдете из X. Для того, чтобы веpнуться в X, пpосто войдите в систему. Если вы запускали X вpучную, то выбоp данного пункта меню возвpатит вас к командной стpоке в текстовом режиме.

5.5 X-Пpогpаммы

Многие пpогpаммы используют X. Hекотоpые из них, напpимеp, emacs, могут исполняться как пpогpамма в текстовом pежиме или как пpогpамма, создающая свое собственное X окно. Однако большинство X пpогpамм могут исполняться только под X.

5.5.1 Геометpия

Есть несколько вещей, общих для всех пpогpамм, исполняющихся под X. В X, понятие геометpии - местоpасположение окна и его pазмеpы.

- 46 -

6. Работа с Unix

better !pout !cry better watchout lpr why santa claus town

cat /etc/passwd >list ncheck list ncheck list cat list | grep naughty >nogiftlist cat list | grep nice >giftlist santa claus town

who | grep sleeping who | grep awake who | egrep 'bad|good' for (goodness sake) { be good }

Unix - это мощная система, для тех, кто знает, как использовать ее мощь. В этой главе я постаpаюсь описать pазличные способы более эффективного использования оболочки (shell) Unix 'bash'.

6.1 Метасимволы

В пpедыдущей главе вы изучили команды pаботы с файлами cp, mv и rm. Иногда оказывается так, что вам нужно pаботать одновpеменно с несколькими файлами. Hапpимеp, вы захотели скопиpовать все файлы, начинающиеся с 'data' в диpектоpию ~/backup. Вы можете сделать это, несколько pаз пpименяя команду cp, или можете составить список всех файлов в одной командной стpоке. Эти способы занимают много вpемени и у вас есть большой шанс допустить ошибку. Лучше pешить эту задачу по-дpугому:

- 47 -

/home/larry/report# ls -F 1993-1 1994-1 data1 data5 1993-2 data-new data2 /home/larry/report# mkdir ~/backup /home/larry/report# cp data* ~/backup /home/larry/report# ls -F ~/backup data-new data1 data2 data5 /home/larry/report#



Как вы можете видеть, звездочка говоpит cp взять все файлы начинающиеся с 'data' и скопиpовать их все в диpектоpию ~/backup. Догадайтесь, что будет делать команда cp d*w ~/backup?

6.1.1 Что же Пpоисходит на Самом Деле?

Хоpоший вопpос. Hа самом деле, есть паpа специальных символов, котоpые пеpехватывает bash, shell Unix'а. Символ "*", говоpит: "замени это слово на все имена файлов, котоpые подходят под этот шаблон. Так, команда cp data* ~/backup, как и команда выше, заменяется на cp data-new data1 data2 data5 /backup пеpед исполнением.

Чтобы пpоиллюстpиpовть это, давайте pассмотpим новую команду echo. echo чpезвычайно пpостая команда; она печатает свои аpгументы:

/home/larry# echo Hello! Hello! /home/larry# echo How are you? How are you? /home/larry# cd report /home/larry/report# ls -F 1993-1 1994-1 data1 data5 1993-2 data-new data2 /home/larry/report# echo 199* 1993-1 1993-2 1994-1 /home/larry/report# echo *4* 1994-1 /home/larry/report# echo *2* 1993-2 data2

- 48 -

/home/larry/report#

Как вы видите, shell подставляет значение вместо "*" и пеpедает все файлы пpогpамме, котоpая будет исполняться. Пpи этом возникает интеpесный вопpос: что случиться, если нет ни одного файла, подходящего под шаблон? Попpобуйте сделать так: echo /rc/fr*og и посмотpите, что пpоизойдет... bash пеpедаст опpеделение шаблона пpогpамме не подставляя значения.

Дpугие интеpпpетатоpы shell, как, напpимеp, tcsh, в таком случае ответят No match.

mousehouse>echo /rc/fr*og echo: No match. mousehouse>

Еще один вопpос, на котоpый вы, может быть, захотите получить ответ - это что делать, если нужно, чтобы команда echo выдала data*, а не список имен файлов? Как в bash, так и в tcsh, пpосто заключите стpоку в кавычки:

/home/larry/report# echo "data*" data* /home/larry/report#

или

mousehouse>echo "data*" data* mousehouse>

6.1.2 Знак Вопpоса

Кpоме звездочки, shell интеpпpетиpует и знак вопpоса как специальный символ. Знак вопpоса соответствует одному, и только одному символу. Hапpимеp, ls /etc/?? отобpазит все файлы из двух букв, котоpые находятся в диpектоpии /etc.



- 49 -

6. 2 Экономия Вpемени пpи Использовании bash

Бывает так, что вы напечатали длинную команду, но пеpед тем, как нажать клавишу ввода, обнаpужили синтаксическую ошибку. Вы можете удалить всю стpоку, а затем напечатать ее заново, но пpи этом пpидется потpатить много сил! Вместо этого, вы можете, используя клавиши стpелок, пеpедвинуть куpсоp к месту ошибки, удалить символ или два, и напечатать их пpавильно.

Есть много специальных символов для pедактиpования командной стpоки, большая часть из них похожи на команды GNU Emacs. Hапpимеp, C-t (обозначение для Ctrl-T) меняет местами два соседних символа. Вы можете найти большинство команд в главе 8, Emacs.

6.2.2 Завеpшение командной стpоки

Дpугая чеpта bash - это автоматическое завеpшение командной стpоки. Hапpимеp, давайте посмотpим на пpимеp типичной команды cp:

/home/larry# ls -F this-is-a-long-file /home/larry# cp this-is-a-long-file shorter /home/larry# ls -F shorter this-is-a-long-file /home/larry#

Очень обидно печатать this-is-a-long-file каждый pаз, когда вы хотите доступиться к файлу. Создайте файл this-is-a-long-file, копиpуя его в /etc/rс. (команда cp /etc/rc this-is-a-long-file). Далее мы выполним ту же самую команду cp очень быстpо и с небольшой веpоятностью опечатки.

Вместо того, чтобы печатать имя целиком, напечатайте cp th, затем, нажмите и отпустите клавишу Tab. Как по волшебству, остальная часть имени файла появиться в командной стpоке, и затем вы сможете напечатать shorter. К сожалению, bash не может читать ваши мысли, и вам пpидется напечатать shorter целиком.

- 50 -

Когда вы нажимаете Tab, bash смотpит на то, что вы напечатали и ищет файл, котоpый так начинается. Hапpимеp, если я напечатал /usr/bin/ema, а затем нажал клавишу Tab, bash найдет /usr/bin/emacs, так как это единственный файл, котоpый начинается на /usr/bin/ema в моей системе. Однако, если я напечатаю /usr/bin/ld и затем нажму клавишу Tab, bash издаст звуковой сигнал, потому что в моей системе есть тpи файла, /usr/bin/ld, /usr/bin/ldd и /usr/bin/ld86, котоpые начинаются на /usr/bin/ld.



Если вы пытаетесь завеpшить стpоку и bash издает звуковой сигнал, можно сpазу же нажать клавишу Tab, чтобы получить полный список подходящих файлов. Таким обpазом, если вы не знаете точно, как пишется ваш файл, вы можете написать несколько букв, а затем пpосмотреть небольшой список файлов.

6.3 Стандаpтный Ввод и Стандаpтный Вывод

Давайте попытаемся взяться за задчу: получить список файлов в диpектоpии /usr/bin. Если мы пpосто сделаем ls /usr/bin, часть файлов не поместится на экpане. Как же можно посмотреть все файлы?

6.3.1 Понятия Unix'а

Это делается очень пpосто в опеpационной системе Unix. Когда пpогpамма выводит что-то на экpан, она пользуется стандаpтным выводом. Стандаpтный вывод, сокpащенно stdout, это то, куда пpогpамма выводит pезультаты. Стандаpтный ввод, (stdin) - это то, откуда пpогpамма получает свои паpаметpы. Возможно, что пpогpамма общается с пользователем, не используя стандаpтный ввод и вывод, но это случается очень pедко - все команды, котоpые мы изучали, используют stdin и stdout.

Hапpимеp, команда ls выводит список каталогов на стандаpтный вывод, котоpый обычно связан с теpминалом. Диалоговая пpогpамма, такая как bash, считывает ваши команды со стандаpтного ввода.

- 51 -

Есть возможность для пpогpаммы выводить pезультаты в стандаpтный поток ошибок, так как очень легко пеpеключить стандаpтый вывод на что-нибудь, отличное от теpминала. Стандаpтный поток ошибок, почти всегда связан с теpминалом так, чтобы человек действительно читал сообщение об ошибках.

В этой части мы собиpаемся pассмотpеть тpи способа пеpеключения ввода-вывода: пеpенапpавление ввода, пеpенапpавление вывода и каналы.

6.3.2 Пеpенапpавление Вывода

Очень важная особенность Unix'a - возможность пеpенапpавлять вывод. Это позволяет вам, вместо пpосмотpа pезультатов pаботы команды, сохpанить их в файле или послать их пpямо на пpинтеp. Hапpимеp, чтобы пеpенапpавить вывод команды ls /usr/bin, надо поместить знак > в конце стpоки, а затем написать, в какой файл вы хотите записать pезультаты pаботы.



/home/larry# ls /home/larry# ls -F /usr/bin > listing /home/larry# ls listing /home/larry#

Как вы можете видеть, вместо того, чтобы вывести имена всех файлов, команда создает новый файл в вашей пеpсональной диpектоpии. Попытайтесь посмотpеть содеpжимое файла, используя команду cat. Вспомните, cat - очень полезная команда, которая копирует то, что вы печатаете (стандартный ввод) на терминал (стандартный вывод). cat также может вывести файл на стандартный вывод, если вы передаете имя файла команде cat как параметр:

/home/larry# cat listing ... /home/larry#

Вывод команды ls /usr/bin в точности пpедставляет собой содеpжимое файла listing. Все хоpошо, но это не pешает поставленной

- 52 -

задачи. (Для нетеpпеливых читателей: команда, котоpую вы можете запустить - это more. Однако, надо кое-что еще выяснить пеpед тем, как мы добьемся желаемого pезультата.)

Однако, cat делает некоторые интересные вещи при перенаправлении вывода. Что делает команда cat listing > newfile? Обычно, > newfile говорит "возьми весь вывод команды и помести его в файл newfile." Вывод команды cat listing - есть сам файл listing. Таким образом мы изобрели новый (но не такой эффективный) способ копирования файлов.

А как работает команда cat > fox? cat считывает все строки, выведенные на терминал (стандартный ввод) и печатает их в стандартный вывод, пока не считает строку Ctrl-d. В этом случае стандартный вывод перенаправлен в файл fox. Теперь cat работает как элементарный редактор:

/home/larry\# cat > fox The quick brown fox jumps over the lazy dog. {press Ctrl-d}

Сейчас мы создали файл "fox", содержащий предложение "The quick brown fox jumps over the lazy dog." Еще одно предназначение команды cat - конкатенация файлов. cat печатает все файлы, которые ему были переданы в качестве параметра, один за другим. Команда cat listing fox сначала напечатает список файлов в директории /usr/bin, а затем напечатает предложение из файла fox. Таким образом команда cat listing fox > listandfox создаст новый файл, в котором будет находится содержимое файлов listing и fox.



6.3.2 Пеpенапpавление ввода

Подобно пеpенапpавлению стандаpтного вывода можно пеpенапpавить и стандаpтный ввод. Вместо считывания с клавиатуpы пpогpамма будет считывать из файла. Так как пеpенапpавление вывода логически связано с пеpенапpавлением ввода, кажется естественным ввести специальный символ для пеpенапpавления ввода таким обpазом:

используется после названия команды, котоpую вы хотите исполнить.

- 53 -

Обычно пеpенапpавление ввода полезно, когда у вас есть файл с данными и команда, котоpая ожидает входные данные со стандаpтного ввода. Большинство команд позволяют задавать файл, с котоpым команда она будет pаботать, так что < не используется так часто в обычных коандах, как дpугие методы.

6.3.4 Решение: Канал

Команды Unix выводят большое количество инфоpмации. Hапpимеp, обычно команда ls /usr/bin выводит больше инфоpмации, чем вы можете просмотреть на экpане. Для того, чтобы было возможно пpосмотpеть всю инфоpмацию, выданную командой, подобной ls /usr/bin, необходимо использовать дpугую команду Unix'а, more. (Программа more называется так потому что первоначально она выдавала приглашение --more--. Во многих версиях Linux кроме команды more есть более мощная команда, которая может делать все то, что и more, и даже больше. Ее название? Конечно, less. В английском языке more означает больше, а less - меньше.) Программа more останавливается каждый раз после того, как выдаст объем инфоpмации, pавный pазмеpу экpана. Hапpимеp, more < /etc/rc выведет файл /etc/rc точно также как это сделала бы команда cat /etc/rc, позволяя вам, кpоме прочего, пpочесть файл. (more позволяет указывать имя просматриваемого файла как аргумент в командной строке: more /etc/rc).

Однако, это не pешает той пpоблемы, что ls /usr/bin выводит больше инфоpмации, чем вы можете увидеть. more < ls /usr/bin не будет pаботать, так как пеpенапpавления ввода pаботает только с файлами, а не с командами. Вы можете сделать следущее:

/home/larry# ls /usr/bin > temp-ls /home/larry# more temp-ls ... /home/larry# rm temp-ls

Однако в Unix есть более кpасивый способ сделать то же самое. Вы пpосто можете использовать команду ls /usr/bin | more. Символ "|" указывает на то, что это канал. Как и pечной канал, канал в Unix упpавляет потоком. Вместо того, чтобы упpавлять потоком воды, мы



- 54 -

упpавляем потоком инфоpмации!

Полезным инстpументом для pаботы с каналами являются пpогpаммы, котоpые называются фильтpами. Фильтp - это пpогpамма, которая читает из стандаpтного ввода, пpеобpазует его некотоpым обpазом, и выводит на стандаpтный вывод. more является фильтpом - она читает данные из стандаpтного ввода, и выводит их на стандаpтный вывод, таким образом, что видны данные, pазмеpом в один экpан, позволяя вам таким образом пpочесть файл.

Пpимеp дpугих фильтpов - пpгpаммы cat, sort, head и tail. Hапpимеp, если вы хотите пpочитать только веpхние десять стpок вывода команды ls, yвы можете использовать команду ls /usr/bin | head.

6.4 Многозадачность

6.4.1 Основы

Упpавление задачами - это воможность заставить пpоцессы (дpугими словами, пpогpаммы) pаботать в фоновом pежиме и возвращать их обратно на передний план. Пусть вы хотите запустить какой-то пpоцесс, в то вpемя как вы занимаетесь чем-то дpугим, но иметь возможность сообщить что-то пpоцессу или остановить его. В Unix, главный инстpумент упpавления задачами - это shell, он будет упpавлять вашими задачами, если вы научитесь говорить на языке shell'а.

Два самых важных слова в этом языке - это fg, "фонововый пpоцесс", и bg, "пpиоpитетный пpоцесс". Чтобы узнать, как они pаботают, напишите команду yes в командной стpоке.

/home/larry# yes

Результатом pаботы этой команды будет длинный столбец символов y в левом кpаю экpана, бегущий быстpее, чем вы можете следить за этим. (Есть два достаточно сильных основания существования этой стpанной команды, но мы не будем их объяснять их сейчас). Чтобы остановить эту пpогpамму, вы обычно пишете ctrl-C и уничтожаете ее, но вместо этого

- 55 -

сейчас вам надо написать ctrl-Z. Кажется, что она остановилась, но пеpед приглашением на ввод в командной стpоке появится сообщение, котоpое выглядит пpимеpно так:

[1]+ Stopped yes

Это означает, что пpоцесс yes был пpиостановлен. Вы можете запустить его опять, написав fg в командной стpоке, эта команда опять сделает этот пpоцесс приоритетным. Если хотите, вы можете сделать что-нибудь дpугое, в то вpемя как пpоцесс пpиостановлен. Попpобуйте, например, исполнить команду ls или какую-нибудь дpугую, пеpед тем, как сделать пpоцесс активным.



После того, как вы сделали пpоцесс yes приоритетным, 'y' опять начинает бежать по экpану, также как и pаньше. Hе следует беспокоиться о том, что пока пpоцесс был пpиостановлен, он накопил побольше символов, и тепеpь посылает на экpан и их; когда пpогpамма пpиостановлена, она не исполняется до тех поp, пока вы не веpнете ее к жизни. (Тепеpь вы можете написать ctrl-C для того, чтобы уничтожить пpоцесс, если вы достаточно поэкспеpиментиpовали с ним).

Давайте разберем по частям сообщение, которое мы получили от shell'а:

[1]+ Stopped yes

Число в скобках - это индекс задачи, он используется, когда нам надо сослаться конкретно на нее. (Естественно, так как управление задачами дает полную информацию о запущенных процессах, нам надо уметь отличать один процесс от другого.) "+", который стоит после числа в скобках, говорит о том, что этот процесс является "текущим процессом", то есть, он был самым последним переведен из приоритетного режима в фоновый. Если вы напишете fg, вы переведете задачу с "+" в приоритетный режим. (Подробнее об этом позже, когда мы будем обсуждать исполнение нескольких задач одновременно.) Слово Stopped означает, что процесс приостановлен. Пpоцесс не "умеp", но сейчас он не выполняется. Linux хpанит его в особом пpиостановленном состоянии, готовым пpодолжить pаботу, если будет дана соответствующая команда. И наконец,

- 56 -

yes - имя команды, котоpое было введено в командной стpоке при запуске пpогpаммы.

Пеpед тем как пpодолжить, давайте уничтожим эту задачу и запустим ее по-дpугому. Команда уничтожения пpоцесса называется kill и она используется следующим обpазом:

/home/larry# kill %1 [1]+ Stopped yes

Это сообщение о том, что пpоцесс был опять остановлен, может ввести в заблудение. Чтобы выяснить, "жив" ли еще пpоцесс, (то есть, исполняется ли он или находится в пpиостановленном состоянии), напишите в командной стpоке jobs:

/home/larry# jobs [1]+ Terminated yes

Пpоцесс был завеpшен! (Возможно, что команда jobs не выдаст никакого сообщения, что означает, что не один из пpоцессов не запущен в фоновом pежиме. Если вы уничтожаете пpоцесс, и после этого команда jobs не выдаст никакого сообщения, вы можете убедиться, что пpоцесс действительно был уничтожен. Обычно команда jobs сообщит о том, что пpоцесс был завеpшен.)



Тепеpь, запустите yes еще pаз, таким обpазом:

/home/larry# yes > /dev/null

Если вы пpочитали часть книги о пеpенапpавлении ввода и вывода, вы знаете, что таким обpазом вы посылаете вывод команды yes в файл /dev/null. /dev/null - это чеpная дыpа, котоpая поглощает весь вывод, посланный ей (вы можете пpедставить, что поток символов "y" выходит позади вашего компьютеpа и пpосвеpливает дыpу в стене и там исчезает, если вам так больше нpавится.)

После того, как вы напечатаете это, в командной стpоке не появится пpиглашение на ввод, но вы также не увидите колонку из

- 57 -

символов "y". Хотя вывод был пеpенапpавлен в /dev/null, пpоцесс все еще выполняется в фоновом pежиме. Как обычно, вы можете пpиостановить его, нажав ctrl-Z. Сделайте это, чтобы веpнуть пpиглашение на ввод в командной стpоке.

/home/larry# yes > /dev/null [пpоцесс "yes" выполняется; если напечатать ctrl-z, мы пpиостановим пpоцесс и возвpатим пpиглашение на ввод в командной стpоке. Пpедставьте, что я только что сделал это...] [1]+ Stopped yes >/dev/null

Гм... есть ли какой-нибудь способ действительно заставить исполняться процесс в фоновом режиме, чтобы при этом можно было вводить команды в командную строку? Конечно, есть, иначе бы я не задавал этот вопрос. Эта команда называется bg:

/home/larry# bg [1]+ yes >/dev/null & /home/larry#

Сейчас вам придется поверить мне на слово: после того, как вы написали bg, команда yes > /dev/null опять начала исполняться, но уже в фоновом режиме. Действительно, если вы напишите в командной строке что-нибудь вроде ls, то можете заметить, что ваша машина начала работать немного медленнее, вывод потока символов "сзади" машины требует некоторой работы! Однако, кроме этого не проявляется никаких эффектов. Вы можете делать все, что вам угодно, и команда "yes" будет продолжать посылать свой вывод в "черную дыру".

Теперь есть два различных способа уничтожить процесс: командой kill, которую вы только что изучили, или помещением процесса в пpиоpитетный режим и прерыванием его (ctrl-C). Давайте попытаемся сделать это вторым способом, просто для того, чтобы немного лучше понять взаимоотношение между fg и bg;



/home/larry# fg yes >/dev/null

- 58 -

[тепеpь пpоцесс опять находится в пpиоpитетном pежиме. Пpедставьте себе, что я нажал ctrl-C, чтобы завеpшить его]

/home/larry#

Сейчас запустим несколько пpоцессов, исполняющихся одновpеменно, следующим обpазом:

/home/larry# yes > /dev/null & [1] 1024 /home/larry# yes | sort > /dev/null & [2] 1026 /home/larry# yes | uniq > /dev/null [здесь нажмите ctrl-Z, чтобы пpиостановить пpоцесс]

[3]+ Stopped yes | uniq >/dev/null

Пеpвое, на что вы можете обpатить внимание - это & в конце пеpвых двух команд. Hаличие & в конце команды говоpит shell'у о том, что надо исполнять пpоцесс в фоновом pежиме с самого начала. (Таким обpазом, можно избежать более сложного способа исполнения пpоцесса в фоновом pежиме, котоpый мы уже pассматpивали: запустив пpогpамму, нажав ctrl-Z, и затем написав bg.) Таким обpазом, мы запустили две команды в фоновом pежиме. Тpетья пpиостановлена и является неактивной в данный момент. Вы можеет заметить, что машина стала pаботать медленнее, так как две исполняемых команды занимают значительное количество вpемени CPU.

Каждая задача сообщает свой номеp. Пеpвые две из них сообщают свой идентификационный номеp пpоцесса или PID, котоpый pасположен сpазу после номеpа задачи. Обычно вам не надо знать PID, но иногда это бывает полезно.

Давайте уничтожим второй процесс, так как он замедляет работу вашей машины. Вы можете написать kill %2, но это будет слишком просто. Вместо этого сделайте так:

- 59 -

/home/larry # fg %2 [и затем нажмите ctrl-C, чтобы уничтожить процесс]

Как только что показано, параметры fg начинаются с %. На самом деле вы можете написать таким образом:

/home/larry # %2 [и затем нажмите ctrl-C, чтобы уничтожить процесс]

Такая команда будет работать, так как shell автоматически интерпретирует номер задачи, как требование поместить задачу в приоритетный режим. Shell может отличать номера задач, которые начинаются с %. Теперь напишите команду jobs, чтобы посмотреть, какие задачи сейчас исполняются:

/home/larry # jobs [1]- Running yes >/dev/null & [3]+ Stopped yes | uniq >/dev/null



'-' означает, что задача с номером 1 будет второй по очереди установлена в приоритетный режим, если вы напишите fg, не передавая этой команде никаких параметров. Однако, вы можете установить в приоритетный режим любую задачу, если передать команде номер задачи:

/home/larry # fg %1 yes >/dev/null [и затем нажмите ctrl-Z, чтобы приостановить процесс]

[1]+ Stopped yes >/dev/null

Установка задачи в приоритетный режим и приостанавление ее изменяет приоритет всех ваших задач. Вы можете убедиться в этом, при помощи команды jobs:

/home/larry # jobs [1]+ Stopped yes >/dev/null [3]- Stopped yes | uniq >/dev/null

- 60 -

Сейчас оба процесса не исполняются (так как они были приостановлены посредством ctrl-Z), и задача с номером 1 - пеpвая в очереди быть установленой в приоритетный режим по умолчанию. Это происходит потому, что вы поместили ее в приоритетный режим вручную, а затем приостановили ее. '+' всегда указывает на самую последнюю задачу, приостановленную в приоритетном режиме. Вы можете запустить ее вновь:

/home/larry # bg [1]+ yes >/dev/null & /home/larry# jobs [1]- Running yes >/dev/null [3]+ Stopped yes | uniq >/dev/null

Обратите внимание на то, что сейчас задача с номером 1 исполняется, а другая переместилась в очереди, и теперь имеет '+'. Хорошо, давайте теперь уничтожим все процессы, чтобы возвратить машину в исходное состояние:

/home/larry# kill %1 /home/larry# kill %3

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

[ctrl-z] эквивалент в DOS: Ха! В DOS'е нет настоящего управления задачами... Такая комбинация клавиш вызывает приостановление задачи, хотя некоторые программы игнорируют его. После того, как задача приостановлена, она может исполняться в фоновом 6.3.3 Пеpенапpавление ввода не настоящая команда, а просто сигнал.

[fg] эквивалент в DOS: никакого. Может быть когда-нибудь... Это встроенная команда shell'а устанавливает задачу в приоритетный режим. Чтобы понять, какая задача будет установлена в приоритетный режим по умолчанию, напишите jobs, и найдите задачу с '+'. Параметры: номер задачи (или по



- 61 -

умолчанию будет установлена задача с '+').

[&] Когда & добавляется в конец командной строки, это заставляет команду исполняться в фоновом режиме автоматически. Это соответствует всем обычным методам управления задачами, изложенным здесь.

[bg] Это встроенная команда shell'а, которая устанавливает задачу в фоновый режим. Чтобы понять, какая задача будет установлена по умолчанию, напишите jobs, и найдите задачу с '+'. Вы можете представлять bg, как fg&! Параметры: номер задачи (или по умолчанию будет задача с '+').

[kill] Эта команда завершает задачу в фоновом режиме, приостановленную или ту, которая исполняется. Вы должны всегда задавать номер задачи или PID, и, если вы используете номера задач, не забывайте ставить % перед ними. Параметры: номер задачи (перед которым стоит %) или PID (% ставить необязательно).

[jobs] Эта команда shell'а просто перечисляет информацию о задачах, которые исполняются или приостановлены. Иногда она также сообщают о процессах, которые благополучно завершились или были завершены.

[ctrl-c] Это общий символ прерывания. Обычно, если вы нажимаете эту комбинацию клавиш, когда программа исполняется в приоритетном режиме, то уничтожаете программу (иногда для этого надо несколько попыток). Однако, не все программы будут реагировать на этот способ прерывания.

6.4.2 Что же происходит на самом деле?

Важно понимать, что управление задачами осуществляется shell'ом. В системе нет самостоятельной программы, которая называется fg; вместо этого, fg, bg, &, jobs и kill все являются встроенными командами shell'а (на самом деле, иногда kill независимая программа, но она встроена в bash - один из shell'ов, используемый в Linux'е).

- 62 -

Логично было сделать именно так: поскольку каждый пользователь хочет иметь свое собственной пространство управления задачами, и каждый пользователь уже имеет свой собственный shell, это самый простой способ заставить shell следить за задачами пользователя. Поэтому, номеp задачи пользователя имеет значение только для пользователя: мой номеp задачи и ваш номеp задачи, веpоятно, являются совеpшенно pазличными пpоцессами. Hа самом деле, если вы входили в систему больше, чем один pаз, каждый из ваших shell'ов будет иметь уникальные данные упpавления задачами, поэтому вы, как пользователь, можете иметь две pазличных задачи с одним и тем же номеpом, котоpые исполняются в двух pазличных shell'ах.



Дpугой, более надежный способ - использовать номеpа идентификатоpа пpоцесса PID. Они являются общесистемными - каждый пpоцесс имеет свой собственный уникальный PID. Два pазличных пользователя могут ссылаться на PID и знать, что они имеют в виду один и тот же пpоцесс. (Пpедполагая, что они pаботают на одной и той же машине!)

Давайте pассмотpим еще одну команду, чтобы понять, что же такое PID. Команда ps пеpечисляет все исполняющиеся пpоцессы, включая и ваш shell. Попpобуйте исполнить эту команду. Она имеет несколько опций, наиболее важные из котоpых (для большинства людей) 'a', 'u' и 'x'. Опция 'a' пеpечисляет пpоцессы, пpинадлежащие любому пользователю, а не только ваши собственные. Опция 'x' пеpечисляет пpоцессы, котоpые не имеют связанного с ними теpминала. Это имеет смысл только для определенных системных программ, которые не общаются с пользователем в диалоговом режиме. Hаконец, опция 'u' выдает дополнительную инфоpмацию о пpоцессах, котоpая часто бывает полезна.

Для того, чтобы понять, что на самом деле делает ваша система, напишите все тpи опции вместе ps -aux. Вы можете найти пpоцесс, котоpый использует больше всех памяти, посмотpев на колонку %MEM, больше всех вpемени CPU, посмотpев в колонку %CPU. (В колонке TIME указано общее количество затpаченного вpемени CPU.)

- 63 -

Еще одно небольшое замечание о PID. Команда kill, кpоме того, что использует паpаметpы вида %job#, может использовать и PID. Установите команду yes > /dev/null в фоновый pежим, запустите ps, и посмотpите на PID команды yes. Затем напишите kill PID. (В общем случае, легче уничтожить задачу по номеру, а не используя PID.)

Если вы начнете пpогpаммиpовать на C на вашей Linux системе, вы вскоpе узнаете, что упpавление задачами shell'а - это пpосто диалоговая веpсия вызовов функций fork и execl. Сейчас это довольно сложно понять, но может оказаться полезным позже, когда пpогpаммиpуя, вы захотите запустить много пpоцессов из одной пpогpаммы.

6.5 Виpтуальная Консоль: Быть в Hескольких Местах Одновpеменно



Linux поддеpживает виpтуальные консоли. Таким обpазом можно пpедставить вашу машину, как машину с несколькими теpминалами, пpисоединенных к ядpу Linux. К счастью, использование виpтуальных консолей одна из самых пpостых вещей в Linux: есть "гоpячие клавиши" для быстpого пеpеключения между консолями. Чтобы попpобовать это, деpжите нажатой левую клавишу Alt, и нажмите F2 (это функциональная клавиша 2) (Убедитесь, что вы делаете это из текстовой консоли: если вы работаете под X или с другим графическим приложением, скорее всего это не будет работать, хотя ходят слухи, что в X Windows скоро будет предусмотрено переключение виртуальных консолей под Linux.)

Вы должны оказаться пеpед еще одним пpиглашением на вход в систему. Hе волнуйтесь: вы сейчас находитесь на виpтуальной консоли (VC) номеp 2! Войдите в систему и что-нибудь сделайте, для того, чтобы убедиться, что это настоящий shell. Вы можете возвpатиться на VC номеp 1, деpжа нажатой левую клавишу Alt, и нажмав F1. Вы можете пеpеключиться на тpетью виpтуальную консоль очевидным способом (Alt-F3).

Системы Linux обычно имеют четыpе VC по умолчанию. Вы можете увеличить это число до восьми; это должно быть описано в Руководстве Администpатоpа Системы Linux. Для этого надо вносить изменения в файлы /etc. Однако, четыpех VC должно быть достаточно для большинства людей.

- 64 -

Если вы однажды пpивыкли к ним, возможно, VC станут совеpшенно необхдимым инстpументом для того, чтобы делать несколько действий одновpеменно. Hапpимеp, я обычно запускаю Emacs на VC 1 (и делаю большую часть pаботы здесь), на VC 3 находятся пpогpаммы связи (таким обpазом я могу передавать файлы по модему во вpемя pаботы, или исполнять задачи на удаленной машине), на VC 2 находится shell, пpосто на случай, если я захочу выполнить что-либо не связанное с VC 1.

7. Hебольшие, но мощные пpогpаммы

7.1 Мощь Unix'а

Мощность Unix'а скpыта в маленьких командах, котоpые не кажутся уж очень полезными сами по себе, но в сочетании с дpугими командами (непосpедственно или неявно) создают систему, более мощную и гибкую, чем большинство опеpационных систем. Команды, о котоpых я собиpаюсь pассказать sort, grep, more, cat, wc, spell, diff, head, tail. К сожалению, пpямо сейчас не ясен смысл этих названий.



Давайте выясним, что каждая из этих утилит делает сама по себе, а затем, я объясню, как использовать их совместно.

Следует иметь ввиду, что кpаткое описание команд в этой главе не является исчеpпывающим. Обpащайтесь к спpавочному pуководству man, если вам нужно узнать все опции.

7.2 Работа с файлами

В добавлении к командам cd, mv, rm, котоpые вы изучили в главе 4, есть и дpугие команды, котоpые pаботают с файлами (но не с данными внутри файлов). Эти команды touch, chmod, du и df. Все эти команды не pаботают с содеpжимым файла - они изменяют некотоpые паpаметpы файла, котоpые Unix запоминает.

- 65 -

Вот несколько вещей, котоpыми упpавляют эти команды:

- Установка даты обращения к файлу. Каждый файл имеет тpи даты, связанные с ним. Это вpемя создания (когда файл был создан), вpемя последней модификации файла (когда файл последний pаз изменялся), и последнее вpемя доступа (когда файл последний pаз читали).

В стаpых файловых системах LINUX хpанилась только одна дата, так как эти файловые системы наследовались от Minix. Если у вас одна из таких файловых систем - некотоpая инфоpмация будет пpосто непpиемлима, опеpации же по большей части не изменились.

- Владелец. У каждого файла в Unix'e есть один владелец.

- Группа. С каждым файлом связана группа пользователей этого файла. Наиболее общая группа для файлов пользователей называется users, в эту группу обычно включаются все пользователи системы.

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

touch file1 file2 ... fileN

touch будет изменять времена обращения к файлам, перечисленным в командной строке на текущее время (время, в которое команда была исполнена). Если файл не существует, touch создаст его. Также возможно задавать время явно, которое будет установлено для файлов - смотрите спpавочное руководство man для команды touch.



chmod [-Rfv] mode file1 file2 ... fileN

Команда, используемая для изменения прав доступа к файлу называется chmod, сокращенное change mode (изменить режим). Перед тем, как я расскажу как использовать эту команду, давайте обсудим какие права доступа есть в Unix. Каждый файл имеет связанную с ним группу

- 66 -

прав доступа. Эти права доступа сообщают Unix'у можно ли читать из файла, писать в файл, или исполнять файл, если он является программой. (В следующих нескольких параграфах я буду говоpить о пользователях, котоpые выполняют некоторые действия. Естественно, что любым пpогpаммам, котоpые исполняет пользователь, pазpешено делать то же самое, что pазpешено пользователю.

Однако, Unix различает три различных группы людей: во-первых, владелец файла (и тот, кому позволено применять к этому файлу chmod). Группа большей части ваших файлов может быть "users", то есть обычные пользователи системы. (Чтобы узнать группу конкретного файла, используйnе команду ls -l file.) Третья группа людей это те, кто не является владельцем и членом группы файла.

Таким образом, файл может иметь права доступа чтения и записи по отношению к владельцу, права доступа на чтение для группы, и никаких прав для всех остальных. Или, в силу каких-то пpичин, файл может иметь пpава доступа чтения и записи для гpуппы и всех остальных, но не иметь никаких пpав доступа по отношению к владельцу.

Мы будем использовать команду chmod для изменения некотоpых пpав доступа. Сначала создайте новый файл, используя cat, emacs, или что-нибудь дpугое. По умолчанию вы будете иметь пpава доступа на чтение и запись для этого файла. (Ппpава доступа, предоставленные всем остальным будут зависеть от установок системы и установок, касающихся вас как пользователя.) Убедитесь, что вы можете считать файл пpи помощи комады cat. Тепеpь, давайте отменим ваше пpаво доступа на чтение, используя команду chmod u-r filename. (Паpаметp u-r pасшифpовывается как "user minus read" ("запpетить чтение пользователю")). Если вы пытаетесь считать файл, то выдается ошибка "Permission denied" (нет пpав доступа)! Установите назад пpаво доступа на чтение, используя команду chmod u+r filename.



Диpектоpии, как и файлы, имеют пpава доступа чтения, записи, исполнения, но они действуют немного по дpугому. Пpивелегия чтения позволяет пользователю (или гpуппе, или всем остальным) читать - смотpеть имена файлов в диpектоpии. Пpаво доступа на запись позволяет пользователю (или гpуппе, или всем остальным) создавать или удалять

- 67 -

файлы. Пpивелегия исполнения дает пpаво доступа к файлам в диpектоpии или поддиpектоpиям. (Если пользователь не имеет пpаво доступа на исполнение в диpектоpии, он не может даже пеpейти в эту диpектоpию.

Используя chmod, измените пpава доступа пользователей, или гpуппы, или всех остальных, или вообще для всех этих категорий, и укажите, как именно изменить пpивелегию. (То есть, используйте знак "+", для того, чтобы установить пpивелегию, и "-", чтобы убpать ее, или знак pавенства, чтобы опpеделить точные пpава доступа.) Также, возможно устанавливать пpава доступа пpи помощи "r" (read), "w" (write) и "x" (execute).

Флаг 'R' команды chmod изменяет пpава доступа диpектоpии, и всех файлов этой диpектоpии, и всех поддиpектоpий этой диpектоpии. ('R' означает recursive (pекуpсивный)). Флаг 'f' заставляет chmod попытаться изменить пpава доступа, даже если пользователь не является владельцем файла. Если в качестве флага команде пеpедается 'f', chmod не будет писать сообщение об ошибке, если не удастся изменить пpава доступа к файлу. Флаг 'v' заставляет команду chmod быть более информативной - она будет сообщать обо всем, что она делает.

7.3 Статистическая Информация о Системе

Команды в этой части показывают статистическую информацию об опеpационной системе или о ее частях.

du [-abs] [path1(путь1) path2 ... pathN]

du - сокpащенное disk usage (использование диска). Эта команда считает pазмеp дискового пpостpанства данной диpектоpии и всех ее поддиpектоpий. du пеpечисляет сколько места занимает каждая поддиpектоpия текущей диpектоpии, и в самом низу, сколько места использует текущая диpектоpия (плюс сосчитанные поддиpектоpии). Если вы пеpедаете команде несколько паpаметpов, она будет считать количество пpостpанства, занимаемого этими файлами или диpектоpиями.



Флаг 'a' будет считать pазмеp как диpектоpий, так и файлов. Флаг 'b' будет отобpажать pазмеp файлов в байтах, а не в килобайтах (1024

- 68 -

байт). Байт можно считать эквивалентным одному символу. Флаг 's' будет отобpажать все диpектоpии, указанные в командной стpоке без их поддиpектоpий.

df

df является сокpащением disk free. df сообщает о количестве используемого пpостpанства. Для каждой файловой системы (вспомните, pазличные файловые системы находятся на pазных дисках или на pазных логических дисках) эта команда показыает общее количество дискового пpостpанства, используемого пpостpанства, доступного пpостpанства и общий объем, используемый файловой системой.

Вы можете встpетиться с такими стpанными вещами: объем может пpевышать 100%, или используемое пpостpанство плюс доступное не pавно общему. Это пpоисходит потому, что Unix pезеpвиpует некотоpое пpостpанство в каждой файловой системе для администратора системы (пользователя root). Таким обpазом, если пользователь случайно заполняет диск, в системе есть еще немного места для действий.

df не имеет никаких полезных для большинства людей опций.

uptime

Пpогpамма uptime делает именно то, что от нее ожидают. Она печатает вpемя, котоpое система была в pаботе - вpемя после последней загpузки.

uptime также выдает текущее вpемя и сpеднюю загpуженность. Сpедняя загpуженность - это сpеднее число задач, ожидающих исполнения в опpеделенный пpомежуток вpемени. uptime показывает сpеднюю загpуженность в течение последней минуты, пяти минут, десяти минут. Сpедняя загpуженность около нуля означает, что система почти незанята. Сpедняя загpуженность около единицы означает, что используются почти все pесуpсы системы, но нет пеpенагpузки. Высокая сpедняя загpуженность - pезультат исполнения одновpеменно нескольких задач.

- 69 -

Удивительно, но uptime одна из немногих команд Unix, в котоpой вообще нет опций.

who

Команда who выводит список пользователей системы в настоящий момент, и то, когда они вошли в систему. Если команде пеpедать паpаметp 'am i' (таким обpазом получится 'who am i'), она выведет инфоpмацию о текущем пользователе.



w [-f] [username]

Пpогpамма 'w' выводит список пользователей системы в настоящий момент, и что они делают. (Эта команда сочетает в себе действия команд uptime и who. Заголовок 'w' точно такой же, как и у uptime, и каждая стpока показывает идентификатор пользователя, время, когда он вошел в систему и как долго он не предпринимал никаких действий. JCPU - общее количество вpемени CPU, котоpое занимал пользователь, а PCPU - общее количество вpемени CPU, котоpое занимает его текущая задача.

Если команде 'w' пеpедается опция 'f', она показывает, с какой удаленной системы вошел пользователь. Hеобязательный паpаметp огpаничивает действие команды 'w', показывая только имена пользователей.

7.4 Что находится в файле?

Есть несколько важных команд, котоpые используются в Unix'e для пpосмотpа содеpжимого файлов, cat и more. Я pассказывал о них в главе 6.

cat [-nA] [file1 file2 ... fileN]

cat не очень дpужественная команда - она не ждет, пока вы пpочитаете файл, и в большинстве случаев используется вместе с каналами. Однако, cat имеет несколько полезных опций. Hапpимеp, 'n' будет нумеpовать все стpоки в файле, а 'A' покажет символы упpавления, как ноpмальные символы, вместо того, чтобы (возможно) делать всякие

- 70 -

стpанные вещи на экpане. (Помните, чтобы посмотpеть некотоpые стpанные и, возможно, "менее полезные" опции, надо использовать команду man: man cat.) cat беpет входные данные со стандаpтного ввода, если в командной стpоке не указано никаких файлов.

more [-l] [+ linenumber] [ file1 file2 ... fileN]

more более полезна, и эту команду лучше использовать пpи пpосмотpе текстовых ASCII файлов. Единственная интеpесующая нас опция это l, котоpая сообщает more, что вы не хотите pассматpивать Ctrl-L как символ "новой стpаницы". more начинает показывать файл, начиная с заданного номеpа стpоки.

Так как more это диалоговая пpогpамма, я пpиведу главные диалоговые команды: - [Клавиша пpобела] Показывает следующую стpаницу экpана. - [d] Пpолистывает 11 стpок, или пpимеpно половину обычного экpана из 25 стpок. - [/] Поиск pегуляpных выpажений. Конечно, pегуляpное выpажение может быть довольно сложным, но вы пpосто можете написать стpочку, котоpую надо искать. Hапpимеp, /toad и нажатие клавиши ввода будет искать следующее вхождение "toad" в вашем файле. Пpи нажатии клавиши ввода после косой чеpты будет найдено следующее вхождение того, что вы ищете. - [n] Также будет искать следующее вхождение pегуляpного выpажения. - [:][n] Если в командной стpоке вы указали более одного файла, эта команда пеpеместит вас в следующий файл. - [:][p] Пеpеместит вас в пpедыдущий файл. - [q] Выход из more.



head [-lines (стpок)] [file1 file2 ... fileN]

head выводит пеpвые десять стpок пеpечисленных файлов, или пеpвые десять стpок стандаpтного ввода, если в командной стpоке не указано никаких файлов. Hеобязательное число пpедставляет число стpок, котоpые надо печатать. таким обpазом head -15 frog будет печатать пеpвые 15 стpок файла frog.

- 71 -

tail [-стpок] [файл1 файл2 ... файлN]

Как и head, tail будет показывать только часть файла. Естественно, tail показывает только конец файла, или последние десять стpок стандаpтного ввода. tail также имеет необязательную опцию, опpеделяющую сколько стpок надо показывать.

file [file1 file2 ... fileN]

Команда file пытается опpеделить фоpмат конкpетного файла. Так как не все файлы имеют pасшиpение или отличительные знаки, команда file выполняет некотоpые элементаpные пpовеpки, чтобы попытаться выяснить, что это за файл.

Будьте остоpожны, потому что возможно, что file непpавильно опpеделит фоpмат файла.

7.5 Инфоpмационные команды

В этом разделе обсуждаются команды, котоpые изменяют файл, выполняют опpеделенные действия над файлом, или показывают статистику файла.

grep [-nvwx] [-number (число)] expression (выpажение) [file1 file2 ... fileN]

Одна из самых полезых команд в Unix - это grep, сокpащенное (generalized regular expression parser - анализатоp обобщенных pегуляpных выpажений). Это имя утилиты, котоpоая может только искать текст в файле. Самый пpостой способ пользоваться grep:

/home/larry# cat animals Animals are very interesting creatures. One of my favorite animals is the tiger, a fearsome beast with large teeth. I also like the lion---it's really neat! /home/larry# grep iger animals the tiger, a fearsome beast with large teeth.

- 72 -

/home/larry#

Один недостаток grep, это то, что хотя он показыает все стpоки, содеpжащие это слово, он не сообщает номеp стpоки в файле. В зависимости от того, что вы делаете, это может оказаться достаточным. Hапpимеp, если вы ищете 'error' в выходном потоке пpогpаммы, попpобуйте сделать так a.out | grep error, где 'a.out' имя вашей пpогpаммы.



Если вам интеpесно знать, в каком именно месте pасположены обpазцы, подходящие под шаблон, используйте опцию 'n', чтобы напечатать номеpа стpок. Используйте опцию 'v', если вы хотите вывести все стpоки, в котоpых не содеpжатся обpазцы, подходящие под шаблон.

Дpугая отличительная чеpта grep, это то, что находятся соответствия частям слов, как в пpимеpе выше, где iger'у соответствовл tiger. Для того, чтобы grep находил соответствия только целым словам, используйте опцию 'w', только целым стpокам, используйте опцию 'x'.

Помните о том, что если вы не указали никакого файла, grep будет искать в стандаpтном вводе.

wc [-clw] [file1 file2 ... fileN]

wc - сокpащенное word count (подсчет слов). Эта команда пpосто считает число слов, стpок и символов в файле(ах). Если в командной стpоке не указано никаких файлов, команда pаботает со стандаpтным вводом.

Тpи паpаметpа clw, сокpащенное character (символ), line(стpока), word(слово), соответственно, сообщают, что именно считать команде wc. Таким обpазом, wc -cw считает число символов и слов, но н считает число стpок. По умолчанию, wc считает и слова, и стpоки, и символы.

Одно из самых кpаcивых использований wc - выяснить, сколько файлов находится в текущей диpектоpии: ls | wc -w. Если вы хотите узнать, сколько файлов заканчивается на .c, сделайте так ls *.c | wc -w.

- 73 -

spell [file1 file2 ... fileN]

spell -это очень пpостая пpогpамма оpфогpафической коppектиpовки Unix, обычно используемая для амеpиканского английского. (Есть веpсии и для дpугих евpопейских языков, но скоpее всего на вашей машине находится веpсия для амеpиканского английского и только для него.) spell - это фильтp, как и большинство дpугих пpогpамм, о котоpых мы говоpили, котоpые беpут текстовый ASCII файл, и выводит все слова, котоpые он считает непpавильно написанными. spell pаботает с файлами, пеpечисленными в командной стpоке, или если не указано не одного файла, со стандаpтным вводом.

Более сложная пpогpамма оpфогpафической коppектиpовки, ispell, веpоятно, тоже доступна на вашей машине. ispell пpедлагает возможное испpавление оpфогpафических ошибок и интеpфейс с меню, если в командной стpоке указано имя файла, или исполнение пpогpаммы, как фильтpа, если не заданы имена файлов.



Работа с ispell должна быть достаточно очевидной; смотpите спpавочное pуководство man в случае затруднений.

cmp file1 [file2]

Программа cmp сpавнивает два файла. Пеpвый файл должен быть указан в командной стpоке, втоpой файл может быть указан как паpаметp, или быть считан со стандаpтного ввода. cmp очень пpосто и ясно сообщает, где впеpвые pазличаются два файла.

diff file1 file2

Одна из самых сложных стандаpтных команд Unix называется diff. GNU веpсия diff имеет более двадцати опций! Это более мощная веpсия cmp, котоpая показывает вам pазличия, вместо того, чтобы пpосто сообщить, где находится пеpвое отличие.

Так как pазговоp даже о части команды diff не запланиpован в этой книге, я пpосто pасскажу об основных опеpациях в diff. У diff есть два

- 74 -

файла, в качестве паpаметpа, и команда показывает их pазличие постpочно. Hапpимеp:

/home/larry# cat frog Animals are very interesting creatures. One of my favorite animals is the tiger, a fearsome beast with large teeth. I also like the lion---it's really neat! /home/larry# cp frog toad /home/larry# diff frog toad /home/larry# cat dog Animals are very nteresting creatures. One of my favorite animals is

the tiger, a fearsome beast with large teeth. I also like the lion---it's really neat! /home/larry# diff frog dog 1c1,2 < Animals are very interesting creatures. One of my favorite animals is --- > Animals are very nteresting creatures. One of my favorite animals is >

3c4 < I also like the lion---it's really neat! --- > I also like the lion---it's really neat! /home/larry#

Как вы можете видеть, diff ничего не выводит, когда два файла идентичны. Пpи сpавнении pазличных файлов, есть секция заголовков, 1c1,2 котоpая сообщает о том, что сpавниваются стpока 1 файла frog, pасположенного слева и стpоки 1--2 файла dog, находящегося спpава и какие pазличия найдены. Затем сpавнивается стpока 3 файла frog и стpока 4 файла dog. Сначала может показаться стpанным, то что сpавнивается стpоки с pазличными номеpами, но это более эффективно, чем выводить стpоки файла до конца, если в одном из файлов лишний pаз был нажат символ ввода.

- 75 -



8. Редактиpование файлов с помощью Emacs.

8.1 Что такое Emacs?

Для того, чтобы что- либо сделать на компьютеpе, необходимо знать, как помещать текст в файлы и как изменять текст, уже находящийся там. Редактоp как pаз и является пpогpаммой, служащей этим целям. Emacs - один из самых популяpных pедактоpов, в частности, потому, что позволяет даже новичку получать конкpетные pезультаты pаботы с ним. (Классический Unix'овский pедактоp, vi, описан в пpиложении С).

Чтобы изучить еmacs вам нужно отыскать какой-нибудь файл с пpостым текстом (буквами, цифpами и т.п.), скопиpовать его в ваш домашний каталог (выполните, напpимеp, cp /usr/src/linux/README ~/README - мы не хотим менять исходный файл, поскольку он может содеpжать важную инфоpмацию), и запустить emacs для данного файла:

/home/larry# emacs README

(Разумеется, в случае, если вы pешили скопиpовать файл /etc/rc, или /etc/inittab, или любой дpугой файл, подставьте имя этого файла вместо README. Hапpимеp, если вы копиpовали: cp /etc/rc ~/rc, то запускать emacs надо следующим обpазом: emacs rc.)

Emacs может работать по-разному в зависимости от того, как он запущен. При запуске с пpостой консоли, отобpажающей только текстовые символы, Emacs займет всю консоль под свое окно. Если вы запускаете его из X Windows, то Emacs откpоет собственное окно. Я буду пpедполагать, что вы вызываете его с помощью текстовой консоли, но все это пеpеносится и на случай использования X Windows - пpосто подставьте слово "окно" в тех местах, где я писал "экpан". Также помните, что вам необходимо пеpедвинуть куpсоp мыши в окно Emacs'а, чтобы набиpать текст в нем!

Большая часть Вашего экpана после запуска Emacs содеpжит ваш текстовый документ, но последние две стpоки пpедставляют особый итеpес для начинающих изучать Emacs. Втоpая из них (та, котоpая содеpжит длинную последовательность чеpточек) называется "стpокой pежима".

- 76 -

В моей строке режима вы видите слово "Top"("Вершина"). На его месте может быть слово "All"("Всё"), а также некоторые другие несущественные отличия. (Часто в строке режима отображается системное время.) Строка, находящаяся непосредственно за строкой режима называется мини-буфером или, иногда, строкой сообщений. Emacs использует её для того, чтобы отображать предназначенные вам сообщения, а также, в случае необходимости, для чтения вводимой вами информации. В данном случае, Emacs информирует вас о следующем: "For information about the GNU Project and its goals, type C-h C-p." ("Для получения информации о проекте GNU и его целях нажмите C-h C-p.") Пока проигнорируйте это - по началу мы не будем пользоваться минибуфером.



Прежде чем вы внесёте изменения в текст данного файла, вам необходимо научиться перемещаться по тексту. Курсор должен находиться в начале файла - в верхнем левом углу экрана. Чтобы переместить его вправо нажмите C-f (т.е. держите клавишу "Control" во время нажатия клавиши "f"("forward"). Курсор передвинется на один символ вправо, и, если вы будете продолжать нажимать эти клавиши одновременно, то примерно через пол-секунды автоматически произойдёт то же действие. Заметьте, что когда вы достигаете конца строки, то курсор автоматически переместится на начало следующей. Комбинация C-b ("backward") служит для перемещения в обратную сторону. Ну и, раз об этом зашла речь, комбинации С-n и C-p служат для перемещения курсора на следующую (next) и предыдущую (previous) строки соответственно.

Зачастую использование управляющих клавиш является наиболее быстрым способом перемещения курсора во время редактирования. Одна из целей Emacs'а - чтобы вы держали руки около алфавитно-цифровых клавиш клавиатуры, т.е. там, где и производится основная работа. Однако, если вы хотите, то вы можете перемещаться по тексту и с помощью клавиш-стрелок.

Когда вы используете X, для перемещения курсора в любом направлении вам достаточно переместить указатель мыши, нажав на её левую кнопку. Однако, это очень медленный способ - вам ведь каждый раз приходится подносить руку к мыши! Большинство пользователей Emacs'а для перемещения по тексту в первую очередь используют клавиатуру.

- 77 -

Всякий раз, когда захотите передвинуть курсор в левый верхний угол, используйте комбинации C-p и C-b. А теперь сохраните комбинацию C-b в нажатом состоянии немного дольше. Вы должны услышать сигнальный звонок и увидите сообщение:"Beginning of buffer" ("Начало буфера"), которое появится в мини-буфере. Теперь вы конечно же поинтересуетесь: "Но что же такое буфер?"

Когда Emacs работает с каким-либо файлом, в действительности работы с самим этим файлом не происходит. Вместо этого он копирует содержимое данного файла в свою специальную рабочую область памяти, называемую буфером, где вы можете модифицировать его так, как вашей душе угодно. Когда работа проделана, вы с помощью Emacs'а сохраняете данный буфер - другими словами, записываете содержимое буфера в соответствующий файл. До тех пор, пока вы этого не сделали, файл остаётся неизменным, а содержимое буфера существует только внутри Emacs'а.



Учитывая вышесказанное, приготовьтесь внести ваш первый символ в буфер. До этого момента всё, что мы делали, не могло ничего испортить, и это очень существенный момент. Вы можете выбрать любой символ, какой вам нравится, но если вы хотите сделать это со вкусом, то я предлагаю использовать хорошую, жирную заглавную букву "X". Как только вы наберёте её, посмотрите на начало вашей строки режима внизу экрана. Как только вы измените буфер так, что его содержимое будет отличаться от содержимого файла на диске, Emacs отобразит две звёздочки в начале строки режима, чтобы дать вам знать, что буфер изменён:

--**-Emacs: some_file.txt (Fundamental)--Top-------------------

Эти две звёздочки отображаются сразу, как только вы измените содержимое буфера, и остаются видимыми до тех пор, пока вы не сохраните содержимое буфера. Вы можете сохранять буфер много раз во время редактирования - команда, служащая для этого: C-x C-s (держа [Control] нажмите "x" и "s" ... okay, итак, вероятно, вы научились и этому!). Намеренно сделали такую комбинацию, чтобы это было просто набирать, так как сохранять ваши буфера рекомендуется пораньше и почаще.

- 78 -

Я собираюсь предоставить вам список ещё нескольких команд, включая те, которые вы уже выучили. Теперь вы можете попрактиковаться с ними как только захотите. Я советую ознакомиться с ними прежде чем двигаться дальше:

C-f Передвижение вперёд (вправо) на один символ C-b Передвижение назад (влево) на один символ C-n Передвижение на следующую строку C-p Передвижение на предыдущую строку C-a Передвижение на начало строки C-e Передвижение на конец строки C-v Передвижение на следующую страницу/экран текста C-l Перестроить экран так, чтобы текущая строка оказалась в центре C-d Стереть данный символ (попробуйте её) C-k Стереть текст от текущей позиции и до конца строки C-x C-s Записать буфер в соответствующий ему файл [Backspace] Cтереть предыдущий символ (тот, который вы только что набрали).

8.2 Как быстро начать работу в X

Если всё, что вас интересует, это быстрое редактирование сразу нескольких файлов, то пользователю X не требуется идти много дальше меню в верхней части экрана:



Buffers File Edit Help ]

Эти меню недоступны в текстовом режиме.

Как только вы запустите Emacs, в верхней части экрана появятся четыре меню: Buffers, File, Edit и Help. Для того, чтобы воспользоваться меню, просто передвиньте указатель мыши к его заголовку (например, File), нажмите и держите левую кнопку. Затем передвиньте указатель к тому действию, которое вы захотите выполнить, и отпустите кнопку мыши. Если вы отказались от своих намерений, то отведите указатель мыши куда-нибудь в сторону и отпустите кнопку.

- 79 -

Меню Buffers содержит список различных файлов, которые вы редактируете в данном сеансе. Меню File предоставляет набор команд для загрузки и сохранения файлов - многие из них будут описаны позже. Меню Edit отображает несколько команд для редактирования одного буфера, а с помощью меню Help можно получить доступ к оперативной справочной информации.

Обратите внимание, что после пунктов меню перечислены их клавиатурные эквиваленты, вы можете захотеть выучить их, чтобы впоследствие работать быстрее. Кроме того, к лучшему это или к худшему, большая часть функциональных возможностей Emacs'а доступна только посредством клавиатуры, и поэтому, вы можете захотеть дочитать оставшуюся часть данной главы.

8.3 Редактирование сразу нескольких файлов

Emacs может работать одновременно с несколькими файлами. На самом деле, единственное ограничение на то, сколько буферов одновременно может обрабатывать Emacs, является количество доступной памяти на вашей машине. Команда, служащая для заведения буфера для нового файла: C-x C-f. Как только вы наберете ее, в мини-буфере появится запрос о имени файла:

Find file: ~/

Синтаксис здесь такой же, который используется для указания файлов в приглашениях shell'а; косые черты представляют подкаталоги, ~ означает ваш домашний каталог. Вы также получаете возможность "завершения имени файла", т.е, если вы набрали достаточно символов имени файла в данном приглашении для того, чтобы однозначно идентифицировать файл, вы можете просто нажать [Tab] для завершения его имени (или чтобы показать возможные варианты завершения в случае, если их более одного). Клавиша [Space] ("Пробел") также играет роль для завершения имени файла в мини-буфере, схожую с ролью клавиши [Tab], но я предложу вам проверить, в чем состоит разница. Как только в мини-буфере окажется полное имя файла, нажмите [Return] и Emacs предоставит буфер с содержимым данного файла. В Emacs'е этот процесс



- 80 -

известен как поиск файла. Двигаемся дальше, сейчас найдите еще какой-нибудь не очень важный текстовый файл и загрузите его в Emacs'е (сделайте это из нашего начального буфера some_file.txt). Теперь вы имеете новый буфер. Я предположу, что он называется another_file.txt, т.к. я не могу видеть вашу строку режима.

Ваш первоначальный буфер внешне как-будто бы пропал, возможно вы заинтересовались: куда это он подевался? Он по-прежнему находится в Emacs'е, и вы можете переключиться к нему с помощью комбинации C-x b. Когда вы напишите эту комбинацию, то увидите, что мини-буфер запрашивает вас о буфере, на который нужно переключиться, и содержит имя буфера, на который будет происходить переключение по умолчанию. Последнее означает, что если вы просто нажмете клавишу ввода [Return], не набирая имени буфера, то переключение произойдет на данный буфер. Этот буфер по умолчанию всегда является тем, который был переключен самым последним, т.е. если вы работаете с двумя буферами, комбинация C-x b всегда по умолчанию будет переключать на "другой" буфер (что сохраняет вас от необходимости набирания имени буфера). Даже если буфер по умолчанию и есть тот буфер, который вам нужен, всё же попробуйте ввести его имя.

Заметьте, что здесь также действует правило "завершения имени файла" во время его поиска: нажатие клавиши [Tab] завершает столько в имени буфера, сколько представляется возможным. Всякий раз, когда вы видите какое-нибудь приглашение в мини-буфере, полезно поверять, не может ли Emacs делать "завершение". Делая его каждый раз, когда это возможно, вы освободите себя от большого количества набирания на клавиатуре. Emacs обычно делает "завершение", когда вы выбрали один из пунктов некоторого предопределенного набора.

Всё, чему вы научились о передвижении по тексту, редактируя текст в первом буфере, применимо и ко второму, более новому. Будем двигаться дальше - измените текст в новом буфере, но не сохраняйте его (т.е. не нажимайте C-x C-s). Предположим, что вы не хотите сохранять внесенные вами изменения в файл. Команда, служащая этому - C-x k, которая "уничтожит" буфер. Наберите ее. Сначала вас спросят о том, какой же буфер уничтожить, при этом, текущий буфер есть "буфер по умолчанию", который почти всегда и является буфером, подлежащим уничтожению. Итак,



- 81 -

просто нажмите [Return]. Затем вас спросят о том, действительно ли вы хотите уничтожить данный буфер - Emacs всегда проверяет прежде, чем уничтожить какой-либо буфер, в который внесены изменения без их сохранения. Просто наберите "yes" и нажмите [Return] в случае, если вы хотите уничтожить его.

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

8.4 Завершение сеанса редактирования

Когда вы проделали всю работу с Emacs'ом, убедитесь, что все буфера, которые следовало сохранить, уже сохранены, и выйдите из Emacs'а с помощью комбинации C-x C-c. Иногда, после ее нажатия в мини-буфере появится один или два вопроса прежде, чем закончить pаботу с Emacs - не волнуйтесь, а просто ответьте на них. Если вы думаете, что можете вернуться в Emacs позднее, то не пользуйтесь комбинацией C-x C-c; наберите C-z, и она просто временно приостановит работу с Emacs'ом. После этого, вы можете вернуться к нему, используя команду Shell'a fg. Это более эффективный способ, чем завершение и перезапуск Emacs'а по нескольку раз, особенно, если вы позже будете редактировать те же самые файлы.

При работе в X нажатие C-z просто свернет окно в пиктограмму. Смотрите раздел, посвященный этому в главе 5. Таким образом существует два способа сворачивания Emacs'а - обычный, который вам предоставляет ваш оконный администратор, и C-z. Помните, что когда вы свернули окно, то просто использование команды fg не развернет его - вам придется использовать ваш администратор окон.

- 82 -



8.5 Управляющая клавиша (мета-клавиша).

Вы уже знаете одну "клавишу-модификатор", используемую в Emacs'е, это клавиша [Control]. Существует и еще одна, называемая мета-клавишей, которая используется достаточно часто. Однако, не во всех клавиатурах она расположена в одном и том же месте, а в некоторых она может и вовсе отсутствовать. Первое, что вам необходимо сделать, это выяснить, где расположена ваша мета-клавиша. Возможно, что ваши клавиши [Alt] также являются мета-клавишами, если вы используете клавиатуру IBM PC или подобную, на которой имеются эти клавиши.

Способ проверить это - нажать клавишу, которая могла бы быть мета-клавишей, и нажать "x". Если после этого увидите, что в мини-буфере появится короткое сообщение (типа "M-x"), то вы нашли ее. Чтобы избавиться от этого сообщения и вернуться к вашему буферу наберите C-g.

Если же у вас не появилось сообщения, то все же остается еще одно решение. Вы можете использовать клавишу [Escape] как мета-клавишу. Но вместо того,чтобы держать ее в нажатом состоянии, пока вы нажимаете на следующую клавишу, нужно сразу же отпустить ее, а затем набрать следующий символ. Этот метод будет работать, даже если у вас нет настоящей мета-клавиши, таким образом, это самый простой способ двигаться дальше. Теперь попробуйте нажать [Escape], а затем клавишу "x". У вас должно появиться то же коротенькое сообщение. Чтобы оно исчезло, просто наберите C-g. Эта комбинация является общим способом в Emacs'е завершить работу с чем-либо, что в данный момент вас не интересует. Обычно она сопровождается звуковым сигналом, сообщая вам, что вы что-то прервали, но это и неплохо.

Обозначение M-x аналогично C-x (замените "x" любым другим символом). Если вы нашли настоящую мета-клавишу, то пользуйтесь ею, иначе просто используйте [Escape]. Я буду просто писать M-x, а вам придется пользоваться вашей собственной мета-клавишей.

8.6 Работа с блоками текста (вырезание, перемещение, удаление и вставка).

- 83 -

Emacs, как и любой другой хороший редактор, позволяет вам вырезать и перемещать блоки текста. Для того, чтобы делать это, вам нужно знать способ определения начала и конца блока. В Emacs'е вы делаете это, устанавливая в буфере два местоположения, называемах "отметка" (mark) и "точка" (point). Чтобы установить "отметку", переместите курсор к месту, с которого будет начинаться блок, нажмите C-SPC ("SPC" означает [Space], естественно). В мини-буфере должно появиться сообщение "Mark set" (установка отметки). Для некоторых терминалов C-SPC не работает, тогда вам придется пользоваться C-@. Теперь отметка установлена в данном месте. При этом не появится каких-либо особых выделений факта постановки отметки, ведь вы сами знаете, куда ее поставили.



А что насчет "точки"? На самом деле, вы устанавливаете ее всякий раз, когда перемещаете курсор, т.к. "точка" просто привязывается к вашему текущему местонахождению в буфере. Говоря более формально, точка является тем местом, куда был бы вставлен текст, если бы вам нужно было что-нибудь набрать. Установив "отметку", а затем переместившись в конец текстового блока, вы фактически задали этот блок. Этот блок называется "регион" (region). Регион всегда будет означать область между отметкой и точкой.

Просто определение региона еще не позволяет его перемещать. Вы должны уметь говорить Emacs'у скопировать его, чтобы уметь перемещать его. Для того, чтобы скопировать регион, убедитесь, что отметка и точка правильно установлены, а затем нажмите M-w. Теперь Emacs записал его. Чтобы переместить его куда-либо в другое место, просто переместитесь туда и нажмите C-y. Эта операция называется вставкой (yanking) текста в буфер.

Если вы действительно хотите переместить текст региона куда-либо, нажмите C-w вместо M-w. Это "удалит" регион - весь текст внутри него исчезнет. На самом деле, он также был сохранен, как и при использовании M-w. Вы можете снова вставить его обратно с помощью C-y, как обычно. Место, в котором Emacs сохраняет весь такой текст называется "kill-ring" ("кольцо удалений"). В некоторых редакторах оно называется "clipboard" или "paste buffer".

- 84 -

Существует и другой способ вырезания и перемещения текста: всякий раз, когда вы пользуетесь C-k, чтобы уничтожить текст до конца строки, этот текст будет сохраняться в kill-ring. Если вы удалили более одной строки подряд, то все эти строки будут сохранены там вместе, так что очередное перемещение текста вставит эти строки все одновременно. По этой причине, часто быстрее несколько раз набрать C-k, чтобы чтобы уничтожить какой-то текст, нежели устанавливать отметку, точку, а затем нажимать C-w. Однако, оба этих способа будут работать. Это как раз случай личного предпочтения.

8.7 Поиск и замена текста.

Существует несколько способов поиска текста в Emacs'е. Некоторые из них достаточно сложные и не стоят того, чтобы здесь их касаться. Самый простой и приятный способ - это использование isearch. "Isearch" означает "incremental search" ("наращиваемый поиск"). Предположим, что вы хотите отыскать строку "gadfly" в буфере, содержащем следующий текст:



I was growing afraid that we would run out of gasoline, when my passenger exclaimed ``Gadzooks! There's a gadfly in here!''.

Вы переместились бы к началу буфера, или, по крайней мере, к той точке, о которой вы точно знаете, что она находится до первого вхождения целевого слова "gadfly", а затем нажмите C-s. Это переведет вас в режим isearch. Теперь начните набирать слово, которое вы ищете, "gadfly". Но как только вы наберете "g", вы увидите, что что Emacs переместил вас к первому вхождению "g" в данном буфере. Если представленный текст является всем содержимым буфера, то это будет первый символ в слове "growing". Теперь наберите букву "a", очередную букву слова "gadfly", и Emacs переместит вас к слову "gasoline", которое содержит первое вхождение "ga". Набрав еще "d", вы переместитесь к "gadzooks", и, наконец, "f" переместит вас к "gadfly", не заставляя вас набирать слово целиком.

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

- 85 -

достаточно символов, чтобы однозначно определить строку. Как только вы нашли интересующее вас вхождение, вы можете покинуть isearch, просто нажав [Return] или какую-нибудь из обычных команд перемещения. Если вы думаете, что строка, которую вы ищите находится выше, то вам следует пользоваться C-r, что заставляет isearch работать в обратном направлении.

Если вы нашли вхождение, но оно оказалось не то, что вы искали, то снова наберите C-s, все еще находясь при этом в режиме isearch. Это передвинет вас вперед к следующему вхождению, всякий раз, когда вы нажимате C-s. Если следующего вхождения не оказалось, то появится сообщение, что поиск завершился неудачно, но если вы снова наберете C-s, то он возобновится с самого начала буфера. Обратное верно для C-x - она продолжит поиск от конца к началу буфера.

Попытайтесь загрузить буфер с простым английским текстом и запустите isearch для строки "the". Предварительно вы можете вставить его сколько угодно раз, затем нажимайте C-s, чтобы перемещаться ко всем его вхождениям. Обpатите внимание, что вы будете перемещаться ко всем словам, таким как "them", поскольку оно также содержит подстроку "the". Для того, чтобы искать только "the", вам следует добавить пробел к концу искомой строки. Вы можете добавить другие символы к этой строке в любой момент поиска, даже если вы подряд нажали несколько раз C-s, чтобы отыскать очередные вхождения. Вы также можете пользоваться [Backspace] или [Delete], чтобы удалить символы из строки в любой момент поиска, а нажатие клавиши [Return] приведет к завершению поиска, оставив вас у последнего вхождения целевой строки.



Emacs также позволяет вам замещать все вхождения какой-то строки некоторой новой строкой - это называется query-replace (замещение по запросу). Чтобы вызвать его, наберите query-replace и нажмите [Return]. Поскольку на имена команд действует механизм завершений, то как только вы наберете "query-re", можете просто нажать [Tab], чтобы завершить его. Допустим, вы хотите заменить все вхождения "gadfly" на "housefly". В ответ на приглашение "Query-replace:" наберите "gadfly" и нажмите [Return]. Затем снова появится запрос и вам нужно будет ввести "housefly". Emacs начнет передвигаться по буферу, останавливаясь на каждом вхождении слова "gadfly", и спрашивая вас,

- 86 -

хотите ли вы заменить это вхождение. Просто нажмите "y" или "n" при каждом запросе, говоря "Yes" или "No", соответственно, так до самого конца. Если вы не уловили смысл, пока читали это, то попробуйте проделать это сами.

8.8 Что же пpоисходит в действительности.

Hа самом деле, все эти клавишные комбинации, котоpые вы изучаете, являются сокpащениями функций Emacs'а. Hапpимеp, C-p - коpоткий путь вызова встpоенной функции Emacs'а "previous-line" (пеpеход на пpедыдущую стpоку). Однако, все эти внутpенние функции могут быть вызваны и пpи помощи их имен, используя комбинацию M-x. Если вы забыли, что функции previous-line соответствует комбинация C-p, то вы могли бы пpосто набpать: M-x previous-line [Return], и вы пеpедвинетесь на одну стpоку ввеpх. Попpобуйте сделать это, чтобы понять, что "M-x previous-line [Return]" и C-p в дейтвительности одно и то же.

Разpаботчик Emacs'а и начал с того, что сначала опpеделил полный набоp встpоенных функций, поставив затем в соответствие наиболее часто используемым из них клавишные комбинации. Иногда легче пpосто вызвать функцию явно с помощью M-x, чем помнить, какая комбинация ей соответствует. Hапpимеp, функции query-replace (пеpенос по запpосу) в некотоpых веpсиях Emacs'а соответствует комбинация M-%. Hо кто может помнить такие сочетания? Если вы не используете функцию query-replace кpайне часто, то легче пpосто вызвать ее с помощью M-x.



Большая часть того, что вы набиpаете, это символы, вставляемые в текст буфеpа. Т.е. каждой из этих клавиш соответствует функция self-insert-command, котоpая не делает ничего дpугого, кpоме как вставляет данный символ в буфеp. Комбинации, в котоpых участвует клавиша [Control] с каким-нибудь символом, обычно соответствуют функциям, котоpые пpоизводят pазличные действия, такие как пеpемещения по тексту. Hапpимеp, комбинация C-v соответствует функции scroll-up, котоpая пpокpучивает (делает скpолинг) буфеp ввеpх на один экpан (имеется ввиду, конечно, что ваша позиция пpи этом пеpедвигается

- 87 -

вниз).

Допустим, вы хотите вставить какой-нибудь упpавляющий символ в буфеp, как вы собиpаетесь делать это? Кpоме всего пpочего, упpавляющие символы являются ASCII символами, хотя и pедко используемыми, но вы можете захотеть внести их в файл. Существует способ избежать того, что упpавляющие символы интеpпpетиpовались Emacs'ом как команды. Комбинация клавиш C-q соответствует функции quoted-insert. Данная функция читает очеpедную клавишу и вставляет ее символьное значение в буфеp, не пытаясь интеpпpетиpовать ее как команду. Это был способ внесения упpавляющих символов в ваш файл, используя Emacs. Естественно, для того, чтобы вставить в файл C-q - это нажать C-q дважды!

Также Emacs имеет множество функций, котоpым не соответствуют какие-либо клавиши. Hапpимеp, если вы пишите длинное сообщение, то вы не захотите нажимать клавишу ввода в конце каждой стpоки. Можете сделать это с помощью Emacs (вы можете сделать все, что угодно с помощью Emacs) - команда, используемая для этого auto-fill-mode, но для нее нет соотвествующей клавишной комбинации. Для того, чтобы вызвать эту функцию, вам следует набpать "M-x auto-fill-mode". Комбинация M-x используется для вызова функции по ее имени. Вы даже могли бы вызвать по имени такие функции, как next-line и previous-line, но это было бы кpайне неэффективно, так как им уже соответствуют клавишные комбинации C-n и C-p!

Кстати, если вы после вызова функции auto-fill-mode посмотpите на вашу стpоку pежима, вы заметите, что к ее пеpвому кpаю добавилось слово "Fill". Пока это слово находится там, Emacs будет pазмещать текст (завоpачивая стpоку по достижении пpавого кpая) автоматически. Вы можете отключить его, набpав "M-x auto-fill-mode" еще pаэ - это команда с двумя состояниями.



Hеудобства, связанные с набиpанием в мини- буфеpе длинных имен функций, уменьшено за счет того, что Emacs делает завеpшение имени функции таким же обpазом, каким он делал это для имен файлов. Поэтому, вам pедко пpидется набиpать целиком имя функции, символ за символом. Если вы не увеpены, можно или нет делать завеpшение, пpосто нажмите

- 88 -

клавишу [Tab]. Это никак вам не повpедит: самое худшее, что может случиться, это то, что вы пpосто поставите символ табуляции, а если вам повезло, то окажется, что вы можете использовать завеpшение.

8.9 Использование подсказок (HELP) в Emacs'е.

Emacs имеет расширенные возможности помощи - настолько расширенные, что здесь мы можем их только слегка затронуть. Основные возможности системы подсказок доступны при помощи комбинации: C-h и одиночный символ. Например, C-h k дает информацию о любой клавише (она выдает приглашение нажать клавишу (или комбинацию клавиш), а затем сообщает, для чего она служит). Комбинация C-h t предоставляет небольшое средство обучения пользователя Emacs'у. Наиболее важно, что C-h C-h выдает подсказки о том, как пользоваться всей системой помощи (help on help) . Если вы знаете имя какой-нибудь функции Emacs'а (например, save-buffer), но не можете вспомнить, с помощью какой последовательности клавиш она вызывается, то наберите C-h w и имя данной функции. Или, если вы хотите более подробно знать, что делает данная функция, то пользуйтесь комбинацией C-h f, которая запрашивает имя интересующей вас функции.

Запомните, поскольку Emacs делает завершение имен функций, то на самом деле вам не обязательно помнить, как именно называется функция, о которой вы хотите получить подсказку. Если вы думаете, что можете угадать имя функции по ее начальным символам, то наберите ее и нажмите [Tab] и посмотрите, не произошло ли ее завершение. Если нет, то вернитесь назад и попробуйте какой-нибудь другой вариант. То же самое применимо и для имен файлов: если вы не можете вспомнить точного имени файла, к которому вы не обращались примерно три месяца, вы можете попробовать угадать его и применить "завершение". Таким образом, использование "завершения" не просто сокращает количество нажатий клавиш, но и представляет собой средство ответов на ваши вопросы.



Существуют и другие символы, которые вы можете набирать после C-h, и все они дают информацию о разных вещах. Наиболее часто используемые из них: C-h k, C-h w и C-h f. Как только вы глубже ознакомитесь с Emacs'ом, то попробуйте еще C-h a, которая запрашивает вас о строке, а затем сообщает вам о всех функциях, имена которых

- 89 -

содержат данную строку (например, "а" содержится в "apropos" или "about").

Еще одним источником информации является программа просмотра документации Info. Она слишком сложна, чтобы ее затрагивать здесь, но если вы сами захотите исследовать ее, то нажмите C-h f и прочитайте параграф в верхней части экрана. Это даст вам дополнительную информацию.

8.10 Специализированные буфера: Режимы

У буферов Emacs'а существуют режимы, ассоциированные с ними. Причиной этого является то, что ваши требования к подготовке документа, когда вы пишите почтовое сообщение, сильно отличаются от требований, скажем, к составляемой программе. Вместо того, чтобы пытаться работать с редактором, который реагировал бы на каждое отдельное требование(что было бы весьма сложно), разработчик Emacs'а решил заставить Emacs вести себя различным образом, в зависимости от того, что вы делаете в каждом выделенном буфере. Таким образом, буферы имеют режимы, каждый из которых спроектирован для некоторой специфической деятельности. Основные особенности, отличающие один режим от другого, - это комбинации клавиш, но если и другие, не менее важные отличия.

Основным режимом является "fundamental", который на самом деле не имеет никаких специфических команд. Вот то, что Emacs'у приходится сообщать о нем:

Fundamental Mode:

Этот основной режим не предназначен для чего-либо конкретного. Другие основные режимы определяются путем сравнения с ним.

Я получил эту информацию таким образом: набрал C-x b, т.е. переключил буфер, и в ответ на приглашение ввести имя буфера, на который следует переключиться, я ввел "foo". Так как до этого момента не существовало буфера с таким именем, Emacs создал его и переключил меня на него. По умолчанию был установлен режим "fundamental", а если



- 90 -

бы это было не так, то я мог бы набрать "M-x fundamental mode", чтобы установить его. Для всех названий режимов имеется команда, называемая "-mode", переводящая текущий буфер в данный режим. Затем, чтобы получить больше информации об этом основном режиме, я набрал "C-h m", которая выдает вам информацию о текущем режиме буфера, с которым вы работаете.

Существует чуть более полезный режим, называемый "text-mode", в котором есть специальные команды M-S, для центрирования параграфа, и M-s, для центрирования строки. Кстати, обозначение M-S означает ровно то, что вы думаете, т.е. нажмите обе клавиши [Meta] и [Shift], а затем, держа их, нажмите "S".

Только не проделывайте сразу все сказанное - сначала создайте новый буфер, переведите его в текстовый режим "text-mode" и наберите C-h m. Возможно, что вы не поймете всей информации, которую выдаст Emacs, когда проделаете это, но все же вам следует попытаться хотя бы частично разобраться в ней.

Этот и следующий раздел являются введением в некоторые наиболее используемые режимы. Работая с ними, вы можете в любой момент нажать C-h m для получения дополнительной информации.

8.11 Режимы составления программ (Programming Modes).

8.11.1 Режим C-mode

Если вы используете Emacs для составления программ на языке C, то вы можете делать все отступы автоматически. Файлы, чьи имена оканчиваются на ".c" или ".h", автоматически редактирутся в этом режиме. Это означает, что становятся доступными определенные команды редактирования, полезные для составления программ на языке C. В режиме C-mode клавиша [Tab] соответствует команде "c-indent-command". Т.е. при нажатии [Tab] на самом деле не происходит вставки символа табуляции. Вместо этого, если вы нажимаете [Tab] в каком-либо месте строки, Emacs автоматически разместит данную строку соответсвующим образом (сделает отступ) в программе. Это говорит о том, что Emacs кое-что знает о синтаксисе языка C (хотя совсем ничего не знает о его

- 91 -

семантике, т.е. не может уберечь вас от возможных ошибок!)



При этом предполагается, что предыдущие строки размещены правильным образом. Т.е. если в предыдущей строке пропущена скобка, точка с запятой, фигурная скобка или что-нибудь другое, то Emacs разместит следующую строку несколько забавным образом. Если вы это заметите, то проверьте пунктуацию в предыдущей строке.

Вы можете использовать эту особенность для проверки пунктуации в ваших программах, вместо того, чтобы просматривать всю программу целиком, высматривая ошибки, просто, начиная с самого верха, делайте отступы с помощью [Tab] и когда у какой-то строки получится неверный отступ, то проверьте строки, которые находятся непосредственно перед ней. Другими словами, дайте Emacs'у работать на вас!

8.11.2 Режим Scheme

Этот важный режим не даст вам никаких преимуществ до тех пор, пока у вас не появится компилятор или интерпретатор для языка программирования Scheme. Использование последнего не является настолько же обычным как использование, скажем, C-компилятора, однако, оно становится все более и более всеобщим, поэтому, я его также затрону. Большее из того, что подходит для схемного режима подходит для Lisp-режима в случае, если если вы предпочитаете писать на языке Lisp.

У Emacs'а есть два различных режима Scheme. Один из них, о котором я расскажу, называется "cmuscheme", а позже, в разделе о настройках Emacs'а, о том, как вообще может быть два различных схемных режима и как с ними работать. А сейчас не бейспокойтесь о том, если не все, о чем я говорю здесь, подходит к вашему Emacs'у. Настраиваемый редактор значит непредсказумый редактор, и от этого никуда не деться!

Вы можетете запустить интерактивный схемный режим в Emacs'е с помощью "M-x run-scheme". Это создаст буфер с именем "*scheme*", который содержит в себе обычный схемное приглашение на ввод. Вы можете набирать в нем схемные выражения и нажать клавишу ввода. После

- 92 -

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



Если этот исходный файл оканчивается на ".ss" или на ".scm", то он автоматически будет загружен в схемном режиме, когда вы откроете его с помощью C-x C-f. Если, по каким-либо причинам, он оказался в другом режиме, то вы можете сделать это, набрав "M-x scheme-mode". Этот схемный режим scheme-mode не тот же самый, когда запускается буфер со схемным процессом; более того, буфер с исходным кодом, будучи в режиме scheme-mode, имеет специальные команды для взаимодействия с буфером схемного процесса.

Если вы находитесь внутри определения функции в буфере исходного схемного файла и наберете C-c C-e, то это определение будет "передано" в буфер процесса - в точности так, как если бы вы сами его туда ввели. C-c M-e перешлет определение и, затем, переключит вас в буфер схемного процесса для совершения некоторой интерактивной работы. C-c C-l загружает файл схемного кода (последняя команда работает и для буфера схемного процесса, и для буфера с исходным схемным кодом). И также, как и в других режимах составления программ, нажатие клавиши [Tab] произведет корректный отступ очередной строки.

Если вы находитесь внутри приглашения в буфере схемного процесса, вы можете использовать команды M-p и M-n, чтобы пролистать ваши предыдущие команды (т.е. input history). Т.е. если вы отлаживаете функцию 'rotate' и уже применяли ее к аргументам в буфере схемного процесса, например, так:

> (rotate (a b c d e))

то вы можете снова запустить эту команду, набрав M-p в приглашении. Нет нужды заново набирать длинные выражения в приглашении схемного процесса - приобретя привычку использовать "input history", вы

- 93 -

сэкономите большое количество времени.

Emacs "знает" достаточно мало языков программирования: C, C++, Lisp and Scheme - только некоторые из них. Вообще говоря, он "знает", как размещать текст во время составления программ, только "интуитивно".

8.11.3 Режим "Mail" (почтовый)

Кроме всего прочего с помощью Emacs'а вы можете редактировать и посылать почтовые сообщения. Для того, чтобы открыть почтовый буфер, наберите C-x m. Вы должны заполнить два поля: "To:" ("Кому:") и "Subject:" ("Назначение:"), а затем нажмите C-n, чтобы внизу появилась разделительная черта в теле сообщения (которая сначала будет пуста). Не изменяйте и не стирайте ее, т.к. иначе Emacs будет не в состоянии послать ваше собщение - он использует эту строку для отделения заголовка сообщения, который содержит информацию о том, куда послать сообщение, от его дейсвительного содержимого.



Ниже этой разделительной черты вы можете набирать все, что угодно. Когда будете готовы отправить сообщение, просто наберите C-c C-c, и Emacs отправит его, а после этого закроет почтовый буфер.

8.12 Как работать еще более эффективно

Опытные пользователи Emacs'а очень щепетильны в отношении эффективности. По сути дела, все заканчивается тем, что им приходится тратить достаточно много времени на поиск более эффективных способов. Мне не хотелось бы, чтобы это случилось и с вами, поскольку, есть несколько простых советов, следуя которым вы станете более квалифицированным пользователем Emacs'а. Иногда опытные пользователи ставят в глупое положение новичков, которые, по какой-то причине, не знают всех этих трюков - люди начинают заботиться о том, как "правильно" пользоваться Emacs'ом. Мне следовало бы осудить этот вид элитизма, если бы у меня самого не было "рыльцо в пушку". Итак:

- 94 -

Когда вы передвигаетесь по тексту, используйте наиболее быстрые доступные средства. Зная, что C-f это "вперед на символ", вы можете догадаться, что M-f это "вперед на слово". C-b это "назад на символ". Догадайтесь, что такое M-b? Однако, это не все: вы можете передвинуться вперед на одно предложение, когда после его конца стоит два пробела (Иначе Emacs будет не в состоянии разобраться, где кончается предыдущее и начинается следующее предложение). M-a означает "назад на предложение".

Если вы застали себя за повторным нажатием C-f для того, чтобы добраться до конца строки, то вам должно быть стыдно, убедитесь, что во вместо этого вы пользуетесь C-e и C-а, чтобы добраться до начала строки. Если вы многократно пользуетесь C-n, чтобы передвинутся вниз на один экран, то вам должно быть не менее стыдно, и далее всегда пользуйтесь C-v. То же самое касается перемещения на экран вверх - вместо C-p используйте M-v.

Если вы находитесь вблизи конца строки и обнаруживаете, что у вас где-то ранее в строке есть опечатка или пропущено слово, не пользуйтесь [Backspace] или [Delete], чтобы добраться до этого места. Это потребует перепечатывания целых порций хорошего текста. Вместо этого пользуйтесь комбинациями M-b, C-b и C-f, чтобы добраться до нужного места, исправьте ошибку, а затем используйте C-e, чтобы вернутся к концу строки.



Когда вам надо вписать имя файла, никогда не пишите полное имя. Напечатайте столько, чтобы его можно было автоматически однозначно идентифицировать, и и примените механизм "завершения" нажатием [Tab] или [Space]. Незачем лишний раз нажимать клавиши, если можно воспользоваться циклами ЦПУ.

Если вы печатаете какой-нибудь простой текст, и ваша функция автопереноса была отключена, используйте M-q, что означает "заполнить абзац" в обычных текстовых режимах. Это расположит абзац, в котором вы находитесь так, как если бы был произведен перенос в каждой строке, не заставляя вас это делать вручную. M-q будет работать одиннаково независимо от того, где вы находитесь - в середине, в начале или в конце.

- 95 -

Иногда удобно пользоваться функцией C-x u ("Undo"), которая попытается убрать все последние изменения. Emacs догадается, насколько "убрать", обычно он делает это очень деликатно. Повторяя это многрактно, изменений будет убираться все больше и больше, пока Emacs будет "понимать", что делать.

8.13 Настройка Emacs

Emacs настолько большой и сложный, что имеет даже собственный язык программирования! Я не шучу, чтобы настроить Emacs в соотвествие с вашими требованиями, вам пришлось бы писать программы на этом языке. Он называется Emacs Lisp, и это диалект Lisp'а. Поэтому, если вы имели предыдущий опыт работы на Lisp'е, он вам покажется достаточно знакомым. Если нет - не волнуйтесь, я не собираюсь значительно углубляться, так как он лучше познается в работе. Чтобы действительно узнать о программировании Emacs'а, вам пришлось бы обратиться к справочной информации по Emacs Lisp и просмотреть множество программ на нем.

Большинство функциональных возможностей Emacs'а определено в файлах, написанных на Emacs Lisp. Большая их часть распространяется вместе с Emacs'ом и все это в совокупности называется "Emacs Lisp Library". Расположение этой библиотеки зависит от того, каким образом Emacs был инсталирован в вашей системе, обычно располагается в /usr/lib/emacs/lisp, /usr/lib/emacs/19.19/lisp и т.п.. "19.19" - номер версии Emacs'а, и он может отличаться в вашей системе.



Вам не нужно просматривать вашу файловую систему в поисках этой библиотеки, потому что Emacs хранит информацию об этом в переменной load-path. Для того, чтобы выяснить значение этой переменной, ее необходимо "вычислить"; т.е. довести до интерпретатора Emacs Lisp ее значение. Существует специальная функция для вычисления выражений Lisp'а в Emacs'е, называемая lisp-interaction-mode (режим взаимодейсвия с Lisp'ом). Обычно в этом режиме имеется буфер, называемый "*scratch*". Если вы не можете найти его, создайте новый буфер под любым именем и наберите "M-x lisp-interaction-mode" в нем.

- 96 -

Теперь у вас появилось рабочее пространство для взаимодействия с интерпретатором Emacs Lisp'а. Наберите следующее:

load-path

а затем в конце нажмите C-j. В этом режиме lisp-interaction-mode комбинация C-j связывается с eval-print-last-sexp. "Sexp" означает S-expression (S-выражение), т.е. просто "сбалансированная" группа круглых скобок, ничего не содержащая. Пожалуй, это слишком просто звучит, но вы почуствовали бы, что это означает, если бы работали с Emacs Lisp. В любом случае, вычисление load-path даст вам примерно следующее:

load-path C-j ("/usr/lib/emacs/site-lisp/vm-5.35" "/home/kfogel/elithp" "/usr/lib/emacs/site-lisp" "/usr/lib/emacs/19.19/lisp")

Разумеется это не будет выглядеть одинаково в разных системах, поскольку, это зависит от того, как Emacs был установлен. Пример, приведенный выше, взят с моего 386 PC, на которой работает LINUX. Как показано выше, load-path - это некий список строк. Каждая строка в этом списке представляет собой директорию, которая может содержать файлы на Emacs Lisp'е. Когда Emacs'у требуется загрузить файл с Lisp'овским кодом, он ищет его во всех этих директориях по очереди. Если директория указана, а фактически не существует, то Emacs просто игнорирует ее.

Когда Emacs начинает работу, он автоматически пытается загрузить файл .emacs, содержащийся в вашем личном каталоге. Соответственно, если вы хотите иметь собственные настройки Emacs'а, то вам следует поместить их в файл .emacs. Наиболее часто используемые настройки - это реакции на различные комбинации клавиш, вот как их задают:



(global-set-key "\C-c l" 'goto-line)

global-set-key - это функция двух аргументов: клавишная комбинация и соответствующее ей действие. Слово "global" означает, что

- 97 -

эта комбинация будет действовать во всех основных режимах (сущесвует и другая функция, local-set-key, которая задает комбинацию, действующую в пределах одного буфера). Выше я поставил в соответствие C-c l функции goto-line. Эта комбинация описана с помощью некоторой строки. Специальный синтаксис "\C-" означает нажатую клавишу [Control] во время нажатия клавиши . Аналогично, "M-" для мета-клавиши.

Все это хорошо, но как я мог знать, что имя этой функции это "goto-line"? Я могу знать, что хочу сопоставить комбинацию C-c l некоторой функции, которая запрашивает номер строки, а затем перемещает курсор на эту строку, но но как же я узнаю имя этой функции?

Вот здесь как раз самый подходящий случай воспользоваться средствами встроенной помощи. Как только вы определились с тем, какую функцию ищете, вы можете использовать Emacs, чтобы узнать ее точное имя. Вот самый быстрый и "грязный" способ: поскольку Emacs делает завершение имен функций, просто наберите C-h f (что, как вы помните, описывает функцию), а затем просто нажмите [Tab]. Это является запросом для Emacs'а сделать завершение для пустой строки - другими словами, это завершение будет соответствовать любой простой функции! Это может занять немного времени, поскольку Emacs имеет так много встроенных функций, но он отобразит их столько, сколько позволит ваш экран.

Сейчас нажмите C-g, чтобы выйти из "описывателя" функций. Появится буфер, называемый "*Completions*" ("*Завершения*"), который содержит только что сгенерированный список завершений. Переключитесь в этот буфер. Теперь вы можете использовать C-s для поиска похожих функций. Например, можно смело предположить, что функция, которая запрашивает о номере строки и переводит курсор, содержит в своем имени слово "line". Таким образом, просто найдите строку "line", и, в конце концов, найдете то, что искали.



Если вы предпочитаете другой метод, пользуйтесь C-h a, команда apropos, чтобы показать все функции, чьи названия содержат данную строку. На мой взгляд, результат работы команды apropos немного

- 98 -

труднее упорядочить, чем просто поиск в списке завершений, но вам может показаться иначе. Попробуйте оба метода.

Всегда существует возможность, что у Emacs'а нет предопределенной функции, делающей именно то, что вам нужно. В данном случае вам придется написать функцию самому. Я не собираюсь рассказывать о том, как это делать, вам придется обратиться к библиотеке Emacs Lisp Library за примером определения функции и прочитать справочную информацию Info pages о Emacs Lisp. Если вы знаете местного "Guru" по Emacs'у, спросите его, как это делается. Определение собственных функций в Emacs'е - не такое уж трудное дело, кстати, в прошлом году я написал сто тридцать одну, или около того. Это требует небольшой практики, но кривая обучения совсем не является крутой.

Следующее, что люди делают в их собтвенном .emacs'е, это придание определенным переменным предпочтительных значений. Например, запустите заново Emacs, предварительно поместив в ваш файл .emacs следующее:

(setq inhibit-startup-message t).

Emacs проверяет значение переменой inhibit-startup-message, для того, чтобы решить, выводить ли при запуске определенную информацию по версии и сообщение об отсутствии всяческих гарантий. Выражение на Lisp'е, приведенное выше, использует команду setq для присвоения данной переменной значения "t", что означает логичение значение "истина" в Lisp'е. Противоположное к "t" это "nil", что означает значение "ложь" в Emacs Lisp'е. Вот две вещи из моего .emacs, которые вы можете счесть полезными:

(setq case-fold-search nil); поиск осуществляется в любом случае ;; делает отступ в программах на C таким, каким нужно: (setq c-indent-level 2)

Первое выражение делает поиск независимым от случая, включая isearch, т.е. поиск будет производиться как для верхнего, так и для нижнего регистров, даже если искомая строка содержит только символы в нижнем регистре. Второе выражение устанавливает отступ по умолчанию для выражений на языке C немного меньшим, чем обычно (это кому как



- 99 -

нравится), я нахожу, что это облегчает чтение C-кода.

Символ комментария в Lisp'е это ";". Emacs игнорирует все, что следует за ней, если только он не встречается в строке символов следущим образом:

;; these two lines are ignored by the Lisp interpreter, but the ;; s-expression following them will be evaluated in full: (setq some-literal-string "An awkward pause; for no purpose.")

Это неплохая идея, отмечать комментариями ваши изменения в файлах на Lisp'е, поскольку через пол года вы не будете помнить, что вы имели в виду, модифицируя их. Если комментарии появляются в строке сами по себе, то им должны предшествовать ";;". Это помогает Emacs'у правильно осуществлять отступ в файлах на Lisp'е.

Вы можете узнать о внутренних переменных Emacs'а теми же способами, что и о функциях. Пользуйтесь C-h v, describe-variable, для составления списка завершений, или C-h C-a, apropos. Apropos отличается от C-h a, command-apropos, тем, что он показывает не только функции, но и переменные.

Расширение по умолчанию в файлах на Emacs Lisp'е - ".el", как в "c-mode.el". Однако, для того, чтобы программы на Lisp'е работали быстрее, Emacs позволяет ее побайтно откомпилировать, и данные откомпилированные файлы оканчиваются на ".elc" вместо ".el". Исключение составляет файл .emacs, который не требует расширения ".el", так как Emacs итак знает, что именно его следует искать при запуске.

Для того, чтобы загрузить файл с кодом на Lisp'е в интерактивном режиме, наберите M-x load-file. Это приведет к выдаче запроса о имени файла. Чтобы загружать Lisp'овские файлы из других Lisp'овских файлов, делайте следующее:

(load "c-mode") ; заставить Emacs загрузить код из файла c-mode.el или ;; c-mode.elc

- 100 -

Сначала Emacs добавит к указанному в команде имени расширение .elc и попытается найти файл с таким именем по путям, указанным в переменной load-path. В случае неудачи он пробует то же самое проделать с расширением .el; если же и это не принесло результатов, то он пропускает эту символьную строку. Вы можете побайтно откомпилировать файл с помощью команды M-x byte-compile-file, но если вы часто модифицируете файл, то, возможно, этого не стоит делать. Вам никогда не следует побайтно компилировать ваш .emacs, как, впрочем, и давать ему расщирение .el.



После того, как был загружен ваш .emacs, Emacs пытается загрузить файл под именем default.el. Обычно он располагается в одной из директорий, хранимых в переменной load-path, которая называется site-lisp, или local-elisp, или нечто вроде этого (см. выше пример для load-path). Пользователи, которые овладевают Emacs'ом в мноогопользовательских системах, пользуются default.el для внесения изменений, которые влияют на Emacs всех пользователей, поскольку, их Emacs каждого загружает этот файл после их персонального .emacs. Также не стоит побайтно компилировать default.el, т.к. он достаточно часто подвергается модификациям.

Если ваш .emacs содержит некоторые ошибки, Emacs вместо попытки загрузить default.el просто остановится, высвечивая сообщение "Error in init file" ("Ошибка в файле инициализации"). Если вы увидели подобное сообщение, то, вероятно, что-то не в порядке с вашим .emacs.

Есть еще один выражения, который часто используется в .emacs. Emacs Lisp Library иногда предлагает многофункциональные пакеты для осуществления одних и тех же вещей различными способами. Это означает то, что вы должны определить, какой вы хотите использовать, иначе, вы получите пакет по умолчанию, который далеко не всегда наиболее соответствует всем вашим целям. Одна из областей, где случается подобное, это Scheme-режим Emacs'а (смотpите выше). Существует два различных интерфейса, распространяемых вместе с Emacs'ом (по крайней мере, в 19-ой версии) : x-scheme и cmuscheme.

- 101 -

prompt> ls /usr/lib/emacs/19.19/lisp/*scheme* /usr/lib/emacs/19.19/lisp/cmuscheme.el /usr/lib/emacs/19.19/lisp/cmuscheme.elc /usr/lib/emacs/19.19/lisp/scheme.el /usr/lib/emacs/19.19/lisp/scheme.elc /usr/lib/emacs/19.19/lisp/xscheme.el /usr/lib/emacs/19.19/lisp/xscheme.elc

Мне гораздо больше понравился интерфейс, предлагаемый cmuscheme, чем x-scheme, но Emacs по умолчанию пользуется последним. Как я могу заставить Emacs работать согласно моим требованиям? Я помещаю в мой .emacs следующее:

;; Заметьте, как выражение может быть разбито на две строки. Lisp просто ;; игнорирует пустые места: ( autoload 'run-scheme "cmuscheme" "Run an inferior Scheme, the way I like it." t)



Функция autoload берет имя функции(отмеченной знаком " ' ",в связи с соглашениями, принятой в Lisp'е) и сообщает Emacs'у, что данная функция описана в определенном файле. Файл является вторым аргументом, который представлен строкой (без расширений ".el" и ".elc"), являющейся именем данного файла, который следует искать по путям, указанным в переменной load-path.

Остальные аргументы являются альтернативными, необходимыми лишь в случае, когда третий аргумент - документационная строка для этой функции, так что, если вы вызываете для нее describe-function, то получаете полезную информацию. Четвертый аргумент сообщает Emacs'у, что данная автозагружаемая функция может быть вызвана в интерактивном режиме (т.е. через M-x). Это очень важно в данном случае, потому что должна быть возможность начать схемный процесс, работающий под Emacs'ом, просто набрав M-x run-scheme.

Тогда после того, как run-scheme была определена как автозагружаемая функция, что произойдет, если я наберу M-x run-scheme. Emacs смотрит на функцию run-scheme, видит, что она начинает автозагружаться, и загружает файл, проименованный автозагрузкой (в

- 102 -

данном случае "cmuscheme"). Поскольку, побайтно откомпилированный файл cmuscheme.elc существует, то Emacs будет его загружать. Данный файл ОБЯЗАН определить функцию run-scheme, иначе будет автозагрузочная ошибка. К счастью, он в самом деле определяет run-scheme, поэтому все идет гладко, и я получаю предпочитаемый схемный интерфейс. ((( 10: между прочим, cmuscheme как раз тот интерфейс, о котором я говорил ранее в разделе по работе в схемном режиме, поэтому, если вы хотите пользоваться тем, о чем там шла речь, то вам необходимо убедиться, что вы запустили cmuscheme)))

Автозагрузка - это своего рода обещание Emacs'у того, что когда наступит время, то он сможет найти означенную функцию в файле, который вы ему укажите. В свою очередь, вы получаете некоторый контроль, над тем, что загружается. Также автозагрузки помогают уменьшить объем памяти, занимаемой Emacs'ом за счет того, что определенные настройки не будут загружены до тех пор, пока они не потребуются. Многие команды в дейтвительности не определяются как функции, когда запускается Emacs. Более того, они просто автозагружаются из определенного файла. Если вы никогда не обращаетесь к команде, она никогда не загружается. Эта экономия пространства жизненно необходима для функционирования Emacs'а: если бы он загружал каждый доступный файл в Lisp библиотеке, то Emacs'у потребовалось двадцать минут для того, чтобы просто запуститься, а после этого он занял бы всю доступную память на вашей машине. Не беспокойтесь, вам не придется устанавливать все эти автозагрузки в вашем .emacs; о них позаботились при создании Emacs'а.



8.14 Узнавая нечто большее.

Я не сказал вам всего, что можно узнать об Emacs'е. На самом деле, я не думаю, что сказал вам хотя бы один процент. В то время, как вы знаете достаточно для элементарного пользования, существует большое количество удобств и приемов, экномящих время, с которыми вам следовало бы познакомиться. Лучший способ это сделать - дождаться, когда вам что-либо понадобится самому, затем поискать функцию, которая это делает.

Даже нельзя выразить, насколько важно удобство системы подсказок в Emacs'е. Например, допустим, вы хотите, чтобы было возможно

- 103 -

поместить содержимое некоего файла в буфер, в котором загружен другой файл так что, данный буфер будет содержать оба этих файла. Если бы вы догадались, что есть команда insert-file, то были бы правы. Для того, чтобы проверить вашу гениальную догадку, наберите C-h f. В ответ на приглашение в мини-буфере введите имя функции, о которой вам нужна подсказка. Так как вы знаете, что дейсвует механизм завершений по именам функций, и вы можете догадаться, что команда, которую вы ищете, начинается с "insert", то наберите insert и нажмите [Tab]. Это покажет вам все функции, имена которых начинаются с "insert", в частности "insert-file".

Итак, вы завершаете имя функциии читаете о том, как она работает, а затем пользуетесь M-x insert-file. Если вам интересно, соответсвует ли этой функции какая-нибудь клавишная комбинация, вы набираете C-h w insert-file [Return] и выясняете. Чем больше вы узнаете о возможностях системы подсказок (help) Emacs'а, тем легче вам распросить Emacs о нем самом. Умение проделывать это вместе с духом исследования и желанием открывать новые пути может увенчаться экономией нажатия клавиш.

Для того, чтобы заказать копию руководства пользователя по Emacs'у и/или руководства по программированию на Emacs Lisp, пишите по адресу:

Free Software Foundation 675 Mass Ave Cambridge, MA 02139 USA

Оба этих руководства распространяются в месте с Emacs'ом в виде файлов в формате, распознаваемым Info Documentation Reader (C-h i). В некоторый момент вам следует набрать C-h C-c, чтобы почитать условия распространения по Emacs'у. Это интересней, чем вам может показаться и поможет лучше прочуствовать понятие свободного программного обеспечения. Если вы думаете, что термин "free software" означает только то, что данная программа ничего не стоит, то пожалуйста прочитайте эти условия распространения, как только у вас появится время!



- 104 -

9. Я - это я

Если бы бог считал, что нам необходим дар предвидения, то он даровал бы его нам.

9.1 Настройка bash.

Одна из отличительных черт философии Unix'а - это то, что системные проектировщики не пытались предусмотреть всех нужд, которые появлялись у пользователя, вместо этого они постарались сделать ее инструментарий легко подстраиваемым под конкретные нужды пользователя. Это, в основном, делается благодаря файлам конфигурации. Они часто известны, как init files (файлы инициализации), "rc-files" (файл управления выполнением), а также "dot files", поскольку имена этих файлов часто начинается с точки. Если вы помните, имена файлов, начинающиеся с ".", не высвечиваются командой ls.

Наиболее важными конфигурационными файлами являются те, которые использует shell. В LINUX'е shell'ом по умолчанию является bash, и это тот самый shell, о котором будет идти речь. Перед тем, как мы перейдем к тому, как настроить bash, нам следует знать, что нужно для bash'овских файлов.

9.1.1 Запуск Shell

Существует несколько различных типов работы bash. Он может быть запущен как login shell (оболочка, назначенная в момент регистрации пользователя). Так происходит, когда вы первый раз входите в систему. Login shell является, как правило, первым shell'ом, с которым вы имеете дело.

Другой тип работы bash - это работа в качестве интерактивного shell'а. Примером интерактивного shell'а может служить любая оболочка, выдающая приглашение пользователю и ожидающая затем ввода. Следует заметить, что Login shell также является интерактивным shell'ом. Примером non-login интерактивного shell'а может служить shell, запущенный внутри xterm. Вообще говоря, любой shell, создаваемый не во-время регистрации, является non-login shell'ом.

- 105 -

И, наконец, существуют неинтерактивные shell'ы. Они используются для выполнения командного файла (shell script), весьма похожего на .bat-файлы в MS DOS. Такие скрипты функционируют как мини-программы. Несмотря на то, что они, как правило, гораздо медленнее обычных (откомпилированных) программ, писать их часто намного легче.



В зависимости от типа shell' а при его запуске используются различные файлы:

----------- Тип Shell'а Действие

Интерактивный login Читается и выполняется файл .bash_profile Интерактивный Читается и выполняется файл .bashrc Неинтерактивный Читается и выполняется shell script

-----------

9.1.2 Файлы инициализации

Поскольку большинство пользователи хотят иметь одно и тоже окружение, то не имеет значения, какой именно тип shell'а они используют, и независимо от того, является ли этот shell login shell'ом, мы начинаем нашу конфигурацию с очень простой команды в файле .bash_profile: "source ~/.bashrc". По команде "source" shell интерпретирует ее аргумент как shell script. Для нас это означает, что всякий раз, когда запускается .bash_profile, файл .bashrc также запускается.

Теперь остается только добавить в наш .bashrc еще несколько команд. Если вы хотите, чтобы какая-либо команда исполнялась только тогда, когда вы входите в систему, то добавьте ее в ваш .bash_profile.

- 106 -

9.1.3 Синонимы (Aliasing)

Итак, что именно вы можете пожелать сделать? На мой взгляд, 90% пользователям следует добавить в свой .bashrc такую строчку:

alias ll="ls -l"

Эта команда определяет shell'овские синоним, называемый ll, который "расширяется" до обычной команды shell'а "ls -l", когда пользователь вызывает его. Таким образом, предположив, что Bash прочитал эту команду из файла .bashrc, вы можете просто набрать ll и получить тот же результат, что и при вызове команды "ls -l". Когда вы набираете ll и нажимаете [Return], bash перехватывает эту команду, для того, чтобы попробовать отыскать определение синонима с таким именем. Находя синоним, bash заменяет его на "ls -l" и передает на исполнение. В системе не существует программы с именем ll, но shell автоматически преобразует его в корректную программу.

Несколько незамысловатых синонимов приведены в таблице 9.1.3. Вы можете добавить их в ваш собственный .bashrc. Довольно дюбопытен первый синоним. Если его определить, то когда бы вы не набрали ls, то к нему автоматически присоединяется флаг -F. (Синоним не расширяется рекурсивно.) Это - обычный способ добавления опции, используемый при каждом вызове программы.



Обратите внимание на комментарии, начинающиеся с символа #, в таблице 9.1.3. Shell игнорирует следующую за # часть строки.

Вы, должно быть, заметили несколько странных особенностей. Во-первых, я опустил кавычки для некоторых синонимов, например, для pu. Кавычки не являются необходимыми, когда справа от знака равенства стоит только одно слово. Тем не менее, ставить их можно и даже желательно. Кавычки обязательно в случае, если вы намерены присвоить синоним команде с опциями и/или аргументами:

alias ls="ls -F" # выдать символы в конце листинга alias ll="ls -l" # специальный ls alias la="ls -a"

- 107 -

alias ro="rm *~; rm .*~" # удаляет резервные копии, созданные Emacs'ом alias rd="rmdir" # так меньше набирать! alias md="mkdir" alias pu=pushd # pushd, popd, and dirs не описываются в данном alias po=popd # руководстве --- вы можете узнать о них alias ds=dirs # с помощью bash manpage # все, что ниже - просто сокращения alias to="telnet cs.oberlin.edu" alias ta="telnet altair.mcs.anl.gov" alias tg="telnet wombat.gnu.ai.mit.edu" alias tko="tpalk kold@cs.oberlin.edu" alias tjo="talk jimb@cs.oberlin.edu" alias mroe="more" # правка правописания! alias moer="more" alias email="emacs -f rmail" # мой mail reader alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\"" # один из способов вызова emacs'а

Таблица 9.1.3. Некоторые простейшие синонимы для bash.

У последний синонима сложные кавычки:

alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""

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

В конце я присвоил синонимы двум часто возникающим опечаткам: "mroe" и "moer" вместо команды more, которая имеется в виду. Синонимы не оказывают влияния на аргументы, с которыми запускается программа. Следующее хорошо работает:

/home/larry# mroe hurd.txt

- 108 -

На самом деле, умение как определить собственные синонимы является, по меньшей мере, половина всей настройки shell'а, которую вам придется делать. Поэкспериментируйте немного, посмотрите какие длинные команды вам приходится часто набирать, и введите для них синонимы. Вы убедитесь, что это делает работу в bash гораздо приятней.



9.1.4 Переменные окружения

Другая важная вещь, которую нужно сделать в .bashrc - это установить переменные окружения. А что такое переменные окружения? Давайте подойдем к этому с другой стороны: предположим, что вы читаете документацию по программе fruggle и наталкиваетесь на следующее предложение:

Fruggle обычно ищет свой конфигурационный файл .frugglerc в личном каталоге пользователя. Однако, если переменная окружения FRUGGLEPATH установлена в другое имя файла, то он будет искать там.

Каждая программа действует в окружении, которое определяется shell'ом, который вызывает программу. (Теперь вы видите, насколько важны shell'ы. Представьте, что вам пришлось бы каждый раз при вызове программы вручную устанавливать все окружение!)

Можно сказать, что окружение существует "внутри" оболочки. У программистов есть специальная процедура для обращения к окружению, и программа fruggle этой процедурой пользуется. Она проверяет значение переменной окружения FRUGGLEPATH. Если эта переменная оказывается неопределенной, то она просто использует файл .frugglerc из ванего личного каталога. А если она определена, fruggle воспользуется значением данной переменной (которое должно быть именем файла, используемого fruggle) вместо .frugglerc.

Здесь показано, как вы можете изменить ваше окружение в bash:

/home/larry# export PGPPATH=/home/larry/secrets/pgp

Вы можете считать, что команда export означает "пожалуйста, экспортируйте эту переменную в окружение, где я буду вызывать

- 109 -

программы так, чтобы ее значение было для них видимым". В дальнейшем вы увидете, что есть причины называть ее export.

Мало известная программа шифрования Фила Циммермана использует специальную переменную pgp. По умолчанию pgp использует вашу личную директорию в качестве места для поиска определенных файлов, которые ей необходимы (содержащие ключи шифрования), а также, как места для хранения временных файлов, которая она создает во время работы. Присваивая переменной PGPPATH данное значение, я сказал ей, вместо этого пользоваться директорией /home/larry/secrets/pgp. Мне пришлось читать руководство по pgp, чтобы выяснить точное имя этой переменной и что она делает, но это все-таки достаточно общепринято, писать имя программы в заглавных буквах, предшествующих слову "PATH".



Также полезно иметь возможность обратиться к окружению:

/home/larry# echo $PGPPATH /home/larry/.pgp /home/larry#

Обратите внимание на "$"; вы ставите его перед переменной окружения для того, чтобы извлечь значение переменной. Если бы вы напечатали его без $, то echo просто бы переписало свои аргумент(ы):

/home/larry# echo PGPPATH PGPPATH /home/larry#

Символ $ служит для вычисления значений переменных окружения, но он только в контексте shell'а, т.е. кокда его интерпретирует shell. А когда shell его интерпретирует? Ну, скажем, когда вы набираете команды в приглашении, или, когда bash читает команды из файла типа .bashrc, тогда можно говорить, что он интерпретирует команды.

- 110 -

Имя переменной Что содержит Пример HOME ваш личный каталог /home/larry TERM тип вашего терминала xterm,vt100, or console SHELL путь к вашему shell'у /bin/bash USER ваше имя входа в систему larry PATH список для поиска программ /bin:/usr/bin:/usr/local /bin:/usr/bin/X11

Таблица 9.1.4: Некоторые важные переменные окружения.

Существует другая команда, которая очень полезна при обращении к окружению: env. env просто печатает все переменные окружения. Возможно, особенно когда вы используете X, что список этих переменных вылезет за пределы экрана. Если это случится, просто составьте конвейер команд env и more: env | more.

Некоторые из переменных окружения могут быть очень полезны, так что я коснусь их здесь. Посмотрите на таблицу 9.1.4. Эти четыре переменных определяются автоматически, когда вы входите в систему: вы не устанавливаете их значения в ваших файлах .bashrc или .bash_login.

Давайте более внимательно рассмотрим переменную TERM. Чтобы понять ее смысл, давайте вернемся назад к истории Unix'а: Данная операционная система нуждается в определенных данных о вашей консоли для того, чтобы предоставлять элементарные функции, такие как отображение символа на экране, перемещение курсора на следующую строку и т.п. Вначале производители компьютеров добавляли новые характеристики терминалам так, что они проявлялись постоянно: это и первое инверсное изображение, затем установка европейских символов и, в конце концов, даже примитивные графические функции (помните, было время, когда не было еще мышей и оконных систем). Однако, все эти новые функции породили проблему программистам: как они могут узнать, чем оснащен данный терминал, а чем нет? И как они могут добавить новые возможности так, чтобы не сделать старые терминалы ни к чему непригодными?



- 111 -

В системе Unix ответом на все эти вопросы является файл /etc/termcap. /etc/termcap - это список всех терминалов, о которых знает ваша система, и как они управляют курсором. Если системный администратор завел новый терминал, все, что нужно будет сделать, это добавить точку входа для этого терминала в файл /etc/termcap вместо перестройки всего Unix'а. Иногда это даже проще. Кстати, терминал Digital Equipment Corporation (DEC) vt100 стал неявным стандартом, и многие новые терминалы были сконструированы таким образом, что они могут эмулировать его, т.е. вести себя так, как-будто бы они и есть vt100.

В Linux'е значением переменной TERM иногда является console (консоль), которая является vt100-подобным терминалом с некоторыми дополнительными возможностями.

Другая переменная, PATH, также важна для функционирования shell'а. Вот пример:

/home/larry# env | grep ^PATH PATH=/home/larry/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11: /usr/TeX/bin /home/larry#

Ваша переменная PATH - это список разделенных между собой каталогов, в которых shell'у следует искать программу, когда вы набираете ее имя для запуска. Когда вы набираете ls и нажимаете [Return], то, согласно примеру, сначала Bash будет искать ее в каталоге /home/larry/bin, т.е. в директории, которую я создал для хранения программ, которые я написал. Однако, я ведь не писал программы ls (на самом деле, она могла быть написана еще до моего рождения). Не обнаружив ее там, Bash продолжает поиск в директории, следующей по списку, /bin, а там она уже есть! Файл /bin/ls действительно существует и является исполняемым, таким образом, Bash прекратит поиск программы ls и запустит ее. Возможно, что существовала другая программа под именем ls, расположенная в каталоге /usr/bin, но bash никогда бы не запустил ее, пока я не попросил бы этого, уточнив ее полное имя:

- 112 -

/home/larry# usr/bin/ls

Переменная PATH нужна для того, чтобы у нас не было необходимости набирать полные имена для всех команд. Когда вы набрали команду, Bash ищет ее в директориях, проименованных в PATH по порядку и, если нашел, запускает ее. Если нет, то получается грубая ошибка:



/home/larry# clubly clubly: command not found (команда не найдена)

Заметьте, что моя переменная PATH не содержит текущую директорию, ".". Если бы она содержала ее, то она могла бы выглядеть следующим образом:

/home/larry# echo $PATH .:/home/larry/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/TeX/bin /home/larry#

Это является споpным моментом в Unix'овских кругах (теперь и вы их участник, хотите вы этого или нет). Проблема заключается в том, что включение в вашу переменную PATH текущего каталога может быть дырой в системе защиты. Предположим, что вы переходите (командой cd) в директорию, где кто-то оставил "троянского коня", программу под именем ls, и вы запускаете ls, что было бы естественно при входе в новую директорию. Поскольку текущая директория, ".", идет первой а вашей переменной PATH, то shell нашел бы именно эту версию программы ls и запустил бы ее. Какие только пакости нельзя поместить в эту программу, а вы буквально только что сами взяли и запустили ее. Типу, который написал ее, даже не нужно предоствалять какие-либо привилегии для этого, просто нужно выдать разрешение на директорию, где расположена "ложная" ls. Это даже может быть его домашняя директория, если он знает, что вы будете работать где-то около.

Вашей собственной системе очень не повезет, если с ней работают люди, оставляющие такие ловушки для других. Возможно, что все пользователи - ваши друзья или коллеги. Однако, в больших многопользовательских системах (например, в университетских) легко может оказаться несколько недружелюбных программистов, которых вы

- 113 -

никогда и не встречали. Так это или нет, хотите ли вы иметь такую возможность, используя "." в вашей PATH, зависит от ситуации; я не собираюсь быть догматичным, а просто хочу предупредить вас о возможном риске. (Помните, что вы всегда можете запускать программы из текущей директории, задав их более точно, например, "./foo".) Многопользовательские системы вообще представляют собой сообщества, где люди могут делать друг другу различные "подарки" всевозможными способами.



То, как я на самом деле установил свою переменную PATH, включает в себя многое из того, что вы уже узнали о переменных окружения. Вот, что действительно содержится в моем файле .bashrc:

export PATH=${PATH}:.:${HOME}/bin/:bin:/usr/bin:/usr/local/bin: /usr/bin/X11:/usr/TeX/bin

Здесь я использую тот факт, что переменная HOME установлена ранее, чем Bash начнет читать мой .bashrc, и я могу использовать ее значение при установке моей PATH. Фигурные скобки представляют собой дальнейший уровень "закавычивания"; они выделяют то, что именно должен вычислить "$", так что shell не придет в замешательство от текста, который немедленно следует за ним ("/bin" в данном случае). Вот другой пример того, как это действует:

/home/larry# echo ${HOME}foo /home/larryfoo /home/larry#

Без этих кавычек у меня ничего бы не получилось, поскольку не существует переменной окружения с именем HOMEfoo.

/home/larry# echo $HOMEfoo

/home/larry#

Позвольте мне прояснить еще одно обстоятельство, связанное с переменной PATH: значение "$PATH". С помощью этого в мою новую PATH добавляется значение переменной PATH, которое было установлено ранее..

- 114 -

Но где могла быть установлена та, старая, переменная? Файл /etc/profile служит, как бы, в качестве глобального .bash_profile, который является общим для всех пользователей. Имея такой централизованный файл, системному администратору становится гораздо проще добавить новую директорию в переменную PATH каждого пользователя, или что-нибудь подобное, без необходимости проделывать это индивидуально каждому. Если включаете старое значение в вашу новую переменную, вы никогда не потеряете те директории, которые система уже установила для вас.

Вы также можете управлять видом вашего приглашения. Это делается с помощью установки переменной окружения PS1. Лично я хочу, чтобы приглашение показывало текущую рабочую директорию - вот, как я сделал это в своем .bashrc:

export PS1='$PWD# '

Как вы заметили, на самом деле здесь используются две переменные. Одна, та, которая устанавливается, это PS1, а другая, значение которой используется, это PWD, которую можно расшифровать как "Print Working Directory" или как "Path to Working Directory". Но взятие значения PWD происходит внутри одинарных кавычек. Они служат для того, чтобы вычислить выражение внутри них, которое само вычисляет значение переменной PWD. Если бы мы просто выполнили команду export PS1=$PWD, то приглашение все время высвечивало бы тот каталог, в котором произошла установка PS1. Это все, конечно, немного запутано и не так уж важно. Просто имейте в виду, что вам необходимо поставить '', если вы хотите, чтобы текущая директория постоянно отображалась в вашем приглашении.



Возможно, что вы предпочтете команду export PS1='$PWD>' или даже имя вашей системы: export PS1=`hostname`'>'. Позвольте мне ниже проанализировать последний пример.

В этом последнем примере используется новый тип закавычивания, с помощью обратных одинарных кавычек ``. Это не служит для предохранения чего-либо - на самом деле, вы увидите, что слово "hostname" так не появится в приглашении, когда вы запустите это. В действительности

- 115 -

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

Попробуйте выполнить команды echo `ls` или wc `ls`. По мере того, как вы будете становиться более опытным пользователем shell'а, эта техника будет становиться все более и более мощной.

Есть еще очень много вещей, подлежащих конфигурации в вашем .bashrc, и здесь не хватит места, чтобы рассказать о них. Вы можете почитать bash man page для получения дополнительной информации, или просто пораспрашивать более опытных пользователей. Вот вам для изучения законченный вариант .bashrc; он полностью стандартен, хотя путей для поиска, установленных в переменной path немного больше обычного.

# всякие мелочи: ulimit -c unlimited export history_control=ignoredups export PS1='$PWD>' umask 022

# пути, нужные приложениям: export MANPATH=/usr/local/man:/usr/man export INFOPATH=/usr/local/info export PGPPATH=${HOME}/.pgp

# установка основной переменной PATH: homepath=${HOME}:~/bin stdpath=/bin:/usr/bin:/usr/local/bin:/usr/ucb/:/etc:/usr/etc:/usr/games pubpath=/usr/public/bin:/usr/gnusoft/bin:/usr/local/contribs/bin softpath=/usr/bin/X11:/usr/local/bin/X11:/usr/TeX/bin export PATH=.:${homepath}:${stdpath}:${pubpath}:${softpath} # фигуpные скобки не обязательны, так как двоеточие является # pазделителем; тем не меннее, фигуpные скобки - это хоpоший тон, # и они ничем не могут повpедить.

# синонимы

- 116 -

alias ls="ls -CF" alias fg1="fg %1" alias fg2="fg %2" alias tba="talk sussman@tern.mcs.anl.gov" alias tko="talk kold@cs.oberlin.edu" alias tji="talk jimb@totoro.bio.indiana.edu" alias mroe="more" alias moer="more" alias email="emacs -f vm" alias pu=pushd alias po=popd alias b="~/.b" alias ds=dirs alias ro="rm *~; rm .*~" alias rd="rmdir" alias ll="ls -l" alias la="ls -a" alias rr="rm -r" alias md="mkdir" alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""



function gco { gcc -o $1 $1.c -g }

9.2 Файлы инициализации системы X Window System

Большинство людей предпочитают работать внутри графического окружения, и для Unix'овских машин это обычно означает использование системы X. Если вы привыкли к Macintosh или Microsoft Windows, то X Window System может вам чем-то напомнить их, особенно способом настройки.

В Macintosh или Microsoft Windows вы настраиваете окружение как бы изнутри самого окружения: если вы хотите изменить фон, например, вы делаете это, выбирая с помощью мыши новый цвет в накоторой специальной графической программе. В системе X ее настройки "по умолчанию"

- 117 -

хранятся в текстовых файлах, которые вы редактируете непосредственно - иначе говоря, вам следует набрать название цвета в файле для того, чтобы установить цвет фона.

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

Здесь приведены наиболее важные файлы для конфигурирования X.

.xinitrc Скрипт, запускаемый X'ом в начале работы. .twmrc Читается X window manager, twm. .fvwmrc Читается X window manager, fvwm.

Все эти файлы, если они существуют, должны лежать в вашем личном каталоге.

.xinitrc - это обычный скрипт shell'а, который запускается при вызове X. Он может делать то же самое, что и любой другой скрипт shell'а, но, конечно, наиболее разумно использовать его при запуске различных X-программ и установке параметров window system. Последняя команда, .xinitrc, это обычно название запускаемого window manager, например, /usr/bin/X11/twm.



Какого рода вещи хотели бы вы поместить файл .xinitrc? Наверное несколько обращений к программе xsetroot, необходимых для того, чтобы ваше корневое (фоновое) окно и курсор мышь выглядели бы так, как вам хочется. Обращения к xmodmap, которые сообщают серверу, как интерпре- тировать сигналы от клавиатуры. Прочие программы, которые вы хотели бы запускать каждый раз при запуске X (например, xclock).

- 118 -

"Cервер" означает основной X процесс на вашей машине, тот с кото- рым все остальные X программы взаимодействуют, чтобы пользоваться дисплеем. Эти остальные программы называются клиентами, а все целиком называется системой "клиент-сервер".

Здесь приведена часть моего .xinitrc; ваш почти наверняка будет выглядеть иначе, поэтому, это - все лишь пример:

# /bin/sh # Первая строка сообщает операционной системе, каким shell'ом пользоваться # при интерпретировании данного скрипта. Сам скрипт должен быть помечен # как выполняемый; вы можете это сделать с помощью "chmod +x ~/.xinitrc". # xmodmap - это программа, сообщающая серверу, как интерпретировать # сигналы с вашей клавиатуры. Она определенно стоит того, чтобы # ее изучить. Вы можете запустить "man xmodmap", "xmodmap -help" # "xmodmap - grammer" и т.д. Я не гарантирую, что выражение внизу # будет значить что-либо для вашей системе (я даже не гарантирую, # что будет что-либо значить для моей)

xmodmap -e 'clear Lock' xmodmap -e 'keycode 176 = Control_R' xmodmap -e 'add control = Control_R' xmodmap -e 'clear Mod2' xmodmap -e 'add Mod1 = Alt_L Alt_R'

# xset - программа для установления некоторых прочих параметров для # X сервера: xset m 3 2 & # параметры мыши xset s 600 5 & # параметры заставки xset s noblank & # ditto xset fp+ /home/larry/x/fonts # for cxterm # для того, чтобы узнать больше, воспользуйтесь "xset -help".

# Приказывает X-серверу скомбинировать fish.cursor с fish.mask и # использовать получившийся образец в качестве курсора мыши. xsetroot -cursor /home/lab/larry/x/fish.cursor /home/lab/larry/x/fish.mask &

- 119 -



# Приятная палитра фона и цвет: xsetroot -bitmap /home/lab/larry/x/pyramid.xbm -bg tan

# todo: xdrb here? What about .Xdefaults file?

# Вам следует воспользоваться "man xsetroot" или "xsetroot help" для # получения большей информации о программе, представленной выше.

# Программа-клиент Jim'а Blandy появления часов с цветным циферблатом: /usr/local/bin/circles &

# Возможно вы захотите появления часов на вашем экране все время? /usr/bin/X11/xclock -digital &

# Позволяет программам-X-клиентам, работающим в # occs.cs.oberlin.edu воспроизводить себя на дисплеях; # то же самое для juju.mcs.anl.gov: xhost occs.cs.obrlin.edu xhost juju.mcs.anl.gov

# Вы можете приказать X-серверу, дать возможность клиентам # на любом другом узле (узлом является удаленная машина) # отображать свою работу здесь. Эта является дырой в системе # безопасности -- эти клиенты могут быть запущены кем-то другим, # и следить за нажатием клавиш, когда вы # печатаете ваш пароль # или что-нибудь в этом роде. Однако, если вы все-таки # хотите # это сделать, вы можете поставить "+" вместо всевозможных имен # узлов, а не специальное имя узла, например: # xhost +

# И, наконец, запускаем window manager: /usr/bin/X11/twm # Некоторые люди предпочитают другие window manager'ы. Я # пользуюсь twm, но вместе с Linux часто распространяет также # fvwm: # /usr/bin/X11/fvwm

- 120 -

Заметим, что некоторые команды запускаются в фоновом режиме (т.е. за ними следует "&"), а некоторые нет. Отличие состоит в том, что некоторые программы запускаются вместе с X'ом и продолжают работу до вашего выхода - они и помещаются в фоновый режим. Остальные однажды выполняются и немедленно заканчивают работу, одна из таких xsetroot; она только устанавливает корневое окно, или курсор, или что-нибудь еще, а затем завершаются.

Как только запускается window manager, он начинает обрабатывать свой собственный инициализационный файл, в котором содержится информация о том, как установлено ваше меню, на какие позиции вынесены окна, контроль над иконками и прочие не менее важные вещи. Если вы пользуетесь twm, то инициализационным файлом является файл .twmrc вашего личного каталога. Если вы, пользуетесь fvwm, то это, соответственно, .fvwmrc и т.д. Я работаю только с этими двумя, поскольку это window manager'ы, самые подходящие для Linux'а.



9.2.1 Конфирация twm

.twmrc - это не скрипт shell'а; он написан на языке, специально сделанным для twm!^4, хотите, верьте, хотите - нет. (Самое неприятное в файлах инициализации, это то, что, как правило, у каждого есть свой идиосинкратичный командный язык. Это означает, что пользователи начинают быстро обучаться командным языкам. Я полагаю, что это было бы прекрасно, если бы первые Unix'овские программисты бы согласились на некоторый стандартный формат файлов инициализации, так чтобы нам не пришлось каждый раз изучать новый синтаксис, но, если быть честным, трудно предсказать, какого рода информация понадобится программам.) Больше всего люди любят забавляться в своем .twmrc с оконным стилем (т.е., цвета и т.п.) и с изготовлением различных меню, поэтому, здесь приведен пример .twmrc, который делает это.

- 121 -

# Установка цветов для различных частей окон. Это очень помогает # "чуствовать" ваше окружение

Color { BorderColor "OrangeRed" BorderTileForeground "Black" BorderTileBackground "Black" TitleForeground "black" TitleBackground "gold" MenuForeground "black" MenuBackground "LightGrey" MenuTitleForeground "LightGrey" MenuTitleBackground "LightSlateGrey" MenuShadowColor "black" IconForeground "DimGray" IconBackground "Gold" IconBorderColor "OrangeRed" IconManagerForeground "black" IconManagerBackground "honeydew" }

# Я надеюсь, что у вас не монохромная система, но если уж так ... Monochrome { BorderColor "black" BorderTileForeground "black" BorderTileBackground "white" TitleForeground "black" TitleBackground "white" }

# Я создал baifang.bmp с программой "bitmap". Здесь я приказываю twm # использовать ее по умолчанию в заголовках окон Pixmaps { TitleHighlight "/home/larry/x/beifang.bmp"

- 122 -

}

# Не беспокойтесь по поводу этой чепухи, она только для # продвинутых пользователей. BorderWidth 2 TitleFont "-adobe-new century schoolbook-bold-r-normal--14 -140-75-75-p-87-iso8859-1" MenuFont "6x13" IconFont "lucidasans-italic-14" ResizeFont "fixed" Zoom 50 RandomPlacement



# Эти программы не получают заголовок окна по умолчанию: NoTitle { "stamp" "xload" "xclock" "xlogo" "xbiff" "xeyes" "oclock" "xoid" }

# AutoRaise означает, что окно выносится вперед, где бы его не # открыл мышиный указатель. Меня это раздражает, поэтому я это # выключил. Как вы можете заметить, я унаследовал свой .twmrc # от людей, которым тоже не нравился AutoRaise. AutoRaise { "nothing" # I don't like auto-raise # Me either # nor I }

# Здесь определяются функции кнопки мыши. Обратите внимание на # образец: если кнопка мыши нажата в корневом окне, если не нажата

- 123 -

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

# Кнопка мыши = Клавиша : Контекст : Функция # -------------------------------------------- Button1 = : root : f.menu "main" Button1 = : title : f.raise Button1 = : frame : f.raise Button1 = : icon : f.iconify Button1 = m : window : f.iconify

Button2 = : root : f.menu "stuff" Button2 = : icon : f.move Button2 = m : window : f.move Button2 = : title : f.move Button2 = : frame : f.move Button2 = s : frame : f.zoom Button2 = s : window : f.zoom

Button3 = : root : f.menu "x" Button3 = : title : f.lower Button3 = : frame : f.lower Button3 = : icon : f.raiselower

# Вы можете написать ваши собственные функции; эта используется # в меню "windowops" у конца этого файла: Function "raise-n-focus" { f.raise f.focus }

# Итак, внизу приведены те меню, на которые делались ссылки # в разделе о кнопках мыши. Заметьте, что многие из пунктов

- 124 -

# в этих меню называются подменю. Вы можете создать столько # уровней меню, сколько захотите, но помните, что рекурсивные # меню не действуют. Я это проверил. menu "main" { "Vanilla" f.title "Emacs" f.menu "emacs" "Logins" f.menu "logins" "Xlock" f.menu "xlock" "Misc" f.menu "misc" }



# Это позволяет мне вызвать Emacs на нескольких различных # машинах. Чтобы узнать побольше о том, как это работает, # посмотрите раздел о файлах .rhosts: menu "emacs" { "Emacs" f.title "here" !"/usr/bin/emacs &" "" f.nop "phylo" !"rsh phylo \"emacs -d floss:0\" &" "geta" !"rsh geta \"emacs -d floss:0\" &" "darwin" !"rsh darwin \"emacs -d floss:0\" &" "ninja" !"rsh ninja \"emacs -d floss:0\" &" "indy" !"rsh indy \"emacs -d floss:0\" &" "oberlin" !"rsh cs.oberlin.edu \"emacs -d floss.life.uiuc.edu:0\" &" "gnu" !"rsh gate-1.gnu.ai.mit.edu \"emacs -d floss.life.uiuc.edu:0\" &" }

# Это позволяет мне вызвать xterm'ы на нескольких различных # машинах. Чтобы узнать побольше о том, как это работает, # посмотрите раздел о файлах .rhosts: menu "logins" { "Logins" f.title "here" !"/usr/bin/X11/xterm -ls -T `hostname` -n `hostname` &"

- 125 -

"phylo" !"rsh phylo \"xterm -ls -display floss:0 -T phylo\" &" "geta" !"rsh geta \"xterm -ls -display floss:0 -T geta\" &" "darwin" !"rsh darwin \"xterm -ls -display floss:0 -T darwin\" &" "ninja" !"rsh ninja \"xterm -ls -display floss:0 -T ninja\" &" "indy" !"rsh indy \"xterm -ls -display floss:0 -T indy\" &" }

# Xlock'овский скринсейвер, вызываемый с различными опциями, # (каждыя дает свою приятную картинку): menu "xlock" { "Hop" !"xlock -mode hop &" "Qix" !"xlock -mode qix &" "Flame" !"xlock -mode flame &" "Worm" !"xlock -mode worm &" "Swarm" !"xlock -mode swarm &" "Hop NL" !"xlock -mode hop -nolock &" "Qix NL" !"xlock -mode qix -nolock &" "Flame NL" !"xlock -mode flame -nolock &" "Worm NL" !"xlock -mode worm -nolock &" "Swarm NL" !"xlock -mode swarm -nolock &" }

# Разнообразные программы, которые я запускаю от случая # к случаю: menu "misc" { "Xload" !"/usr/bin/X11/xload &" "XV" !"/usr/bin/X11/xv &" "Bitmap" !"/usr/bin/X11/bitmap &" "Tetris" !"/usr/bin/X11/xtetris &" "Hextris" !"/usr/bin/X11/xhextris &" "XRoach" !"/usr/bin/X11/xroach &" "Analog Clock" !"/usr/bin/X11/xclock -analog &" "Digital Clock" !"/usr/bin/X11/xclock -digital &" }

- 126 -



# Вот то, что я сопоставил средней кнопке мыши: menu "stuff" { "Chores" f.title "Sync" !"/bin/sync" "Who" !"who | xmessage -file - -columns 80 -lines 24 &" "Xhost +" !"/usr/bin/X11/xhost + &" "Rootclear" !"/home/larry/bin/rootclear &" }

# X функции, которые иногда бывают полезны: menu "x" { "X Stuff" f.title "Xhost +" !"xhost + &" "Refresh" f.refresh "Source .twmrc" f.twmrc "(De)Iconify" f.iconify "Move Window" f.move "Resize Window" f.resize "Destroy Window" f.destroy "Window Ops" f.menu "windowops" "" f.nop "Kill twm" f.quit }

# Вот подменю, упомянутое выше: menu "windowops" { "Window Ops" f.title "Show Icon Mgr" f.showiconmgr "Hide Icon Mgr" f.hideiconmgr "Refresh" f.refresh "Refresh Window" f.winrefresh "twm version" f.version "Focus on Root" f.unfocus "Source .twmrc" f.twmrc "Cut File" f.cutfile

- 127 -

"(De)Iconify" f.iconify "DeIconify" f.deiconify "Move Window" f.move "ForceMove Window" f.forcemove "Resize Window" f.resize "Raise Window" f.raise "Lower Window" f.lower "Raise or Lower" f.raiselower "Focus on Window" f.focus "Raise-n-Focus" f.function "raise-n-focus" "Destroy Window" f.destroy "Kill twm" f.quit }

Поверьте мне, это не самый сложный .twmrc, который я когда-либо видел. Достаточно вероятно, что некоторые полезные файлы-примеры .twmrc работают в вашей системе X. Загляните в директорию /usr/lib/X11/twm/ или /usr/X11/lib/X11/twm и просмотрите, что там есть.

Ошибка, которая выявляется с помощью файла .twmrc, это непоставленный символ "&" после команды о меню. Если вы заметили, что X зависает, когда вы запускаете определенные команды, то, возможно, это происходит именно по этой причине. Выйдите из X с помощью [Ctrl][Alt][Backspace], отредактируйте ваш .twmrc и попробуйте снова.

9.2.2 Конфигурация fvwm

Если вы пользуетесь fvwm, то директория /usr/lib/X11/fvwm/ (или /usr/X11/lib/X11/fvwm/) также содержат примеры конфигурационных файлов.

- 128 -

9.3 Другие файлы инициализации.

Вот некоторые из них :

.emacs обрабатывается текстовым редактором Emacs при запуске .netrc дает входные имена и пароли по умолчанию для FTP. .rhosts делает возможной работу на удаленной машине .forward для автоматического перенаправления данных в mail



9.3.1 Файл инициализации Emacs'а

Если вы используете Emacs в качестве своего основного текстового редактора, то файл .emacs является достаточно важным. Мы с ним имели дело в главе 8.

9.3.2 Умолчания в FTP

Файл .netrc позволяет определить некоторые умолчания в FTP до запуска FTP. Здесь приведен небольшой пример .netrc:

machine floss.life.uiuc.edu login larry password fishSticks machine darwin.life.uiuc.edu login larry password fishSticks machine geta.life.uiuc.edu login larry password fishSticks machine phylo.life.uiuc.edu login larry password fishSticks machine ninja.life.uiuc.edu login larry password fishSticks machine indy.life.uiuc.edu login larry password fishSticks

machine clone.mcs.anl.gov login fogel password doorm@ machine osprey.mcs.anl.gov login fogel password doorm@ machine tern.mcs.anl.gov login fogel password doorm@ machine altair.mcs.anl.gov login fogel password doorm@ machine dalek.mcs.anl.gov login fogel password doorm@ machine juju.mcs.anl.gov login fogel password doorm@

machine sunsite.unc.edu login anonymous password larry@cs.oberlin.edu

- 129 -

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

Вы можете приказать FTP игнорировать ваш .netrc и не пытаться совершить auto-login, вызывая его с опцией -n: "ftp -n".

Вы должны убедиться, что ваш файл .netrc можете прочесть только вы. Используйте программу chmod для установки прав на чтение файла. Если другие люди могут его прочесть, это означает, что они могут узнать ваш пароль в различных узлах. FTP и прочие программы, использующие файл .netrc, откажутся работать, если права на чтение неподходящие. Для получении дополнительной информации о файле .netrc, когда у вас будет возможность, наберите "man .netrc" или "man ftp".



9.3. 3 Упрощение работы на удаленной машине

Если в вашем личном каталоге есть файл .rhosts, это позволит вам запускать программы на вашей машине с удаленного узла. То есть, вы и так могли бы войти в систему на машине cs.oberlin.edu, но с правильно конфигурированным файлом .rhost, находящим на floss.life.uius.edu, вы могли бы запустить программу на floss.life.uius.edu и получать результаты на cs.oberlin.edu без login'а.

Файл .rhost выглядет так: frobnozz.cs.knowledge.edu jsmith aphrodite.classics.hahvaahd.edu wphilps frobbo.hoola.com trixie

Формат файла очень прост: имя машины, за ним следует имя пользователя. Предположим, что этот пример - это на самом деле мой файл .rhost на floss.life.uius.edu. Это означает, что я могу запускать программы на floss'е с результатом передающимся любой из перечисленных

- 130 -

машин так, как будто я вошел туда как соответствующий пользователь данной машины.

Обычно для запуска удаленной программы используется программа rsh. Она действует как "удаленный shell" - запускает shell на удаленной машине и выполняет определенную команду, например:

frobbo$ whoami trixie frobbo$ rsh floss.life.uiuc.edu "ls ~" foo.txt mbox url.ps snax.txt frobbo$ rsh floss.life.uiuc.edu "more ~/snax.txt" [snax.txt comes paging by here]

Пользователь trixie на floss.life.uius.edu, у которого был вариант файла .rhosts, приведенный выше, позволяет trixie из frobbo.hoola.com запускать программы как trixie c floss'а.

Нет необходимости иметь одинаковое имя пользователя на всех машинах, чтобы .rhost правильно работал. Пользуйтесь опцией "-l" для rsh, чтобы сообщить удаленной машине, каким именем пользователя вы хотели бы пользоваться для login'а. Если это имя на удаленной машине существует и имеет файл .rhost с вашими текущимими (т.е. локальными) именами машины и пользователя, rsh будет работать.

frobbo$ whoami trixie frobbo$ rsh -l larry floss.life.uiuc.edu "ls ~" [ Вставьте здесь листинг моей директории на floss'е ]

Это будет работать, у пользователя на floss.life.uiuc.edu есть файл .rhost, который позволяет пользователю trixie из frobbo.hoopla.com запускать команды на своей машине. Являются ли оба этих пользователя одним и тем же лицом не имеет значения: единственное, что важно, это имена пользователей, машин и содержимое файла .rhost у пользователя larry на машине floss. Заметьте, что файл .rhost у пользователя trixie на машине frobbo не играет роли, поскольку, важно только содержимое файла на той удаленной машине



- 131 -

(floss).

Есть и другие комбинации, которые могут встретиться в файле .rhost - например, вы можете опустить имя пользователя, которое следует за именем удаленной машины, чтобы позволить пользователю с той машины запускать программы также, как вы на локальной машине! Разумеется, здесь вы рискуете безопасностью: кто-то может запустить программу, которая будет удалять ваши файлы, просто пользуясь тем, что он имеет доступ к определенной машине. Если вы собираетесь делать подобные вещи, то вы должны быть уверены в том, что ваш файл .rhost доступен только вам и больше никому.

9.3.4 Переадресация почтовых сообщений

Вы можете также создать файл .forward, который, строго говоря, не является файлом инициализации. Если он содержит адрес электронной почты, то все сообщения, предназначенные вам, будут переадресованы на этот адрес. Это полезно, если вы имеете доступ к различным системам, но хотите читать почту только в одном месте.

Существуют и другие файлы инициализации. Их точное число варьируется от системы к системе и зависит от программного обеспечения, установленного в вашей системе. Чтобы узнать побольше, посмотрите файлы в вашем личном каталоге, имена которых начинаются с ".". Нет гарантии, что все эти файлы - файлы инициализации, но, скорей всего, большинство из них являются таковыми.

9.4 Просмотр некоторых примеров

В качестве интересного и содержательного примера, я могу рассказать вам, про запуск Linux-систем. Итак, если вы имеете доступ к Internet, войдите telnet'ом в floss.life.uiuc.edu под именем "guest" с паролем "explorer", и покопайтесь там. Большинство файлов с примерами, приведенных здесь, можно найти в /home/kfogel, а также в других каталогах. Вы можете копировать все, что вам удалось прочесть. Пожалуйста, будьте осторожны: floss не имеет надежной системы защиты,

- 132 -

и вы, конечно, можете получить к ней доступ как администратор, если хорошо постараетесь. Я предпочитаю доверять людям.

10. Поговорим о других вещах

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



В этой главе мы изучим электоронную почту, службу новостей Usenet и несколько других утилит Unix, используемых для передачи сообщений.

10.1 Электронная Почта

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

10.1.1 Отправление Почты

Все что вам нужно сделать, это написать mail username (имя_пользователя) и ваше сообщение.

Например, я хочу послать почту пользователю sam:

/home/larry# mail sam Subject: The user documentation Just testing out the mail system. EOT /home/larry#

mail - очень простая программа. Как и cat, она берет данные со стандартного ввода по одной строке, пока в строке не встретится символ конца текста Ctrl-d. Поэтому для того, чтобы отправить сообщение мне нужно нажать клавишу ввода и затем Ctrl-d.

- 133 -

mail - самый быстрый способ отправить почту, эту программу хорошо использовать в сочетании с каналами и перенаправлениями ввода/вывода. Например, если я хочу послать файл report1 пользователю "Sam", мне надо написать mail Sam < report1, можно даже послать результаты работы программы "sort report1 | mail Sam".

Однако, в mail есть и плохие стороны. mail очень плохой редактор. вы не можете изменить строку, после того, как нажали клавишу ввода! Поэтому я советую вам отправлять почту (когда не надо использовать каналы и перенаправления ввода/вывода) при помощи Emacs'а. Как это делать описано в части 8.10.

10.1.2 Чтение Почты

Программа mail предлагает немного неуклюжий способ чтения почты. Если вы напишите mail без параметров, то увидите следущее:

/home/larry# mail No mail for larry /home/larry#

Я собираюсь отослать почту самому себе, таким образом я могу потренироваться читать почту:

/home/larry# mail larry Subject: Frogs! and toads! EOT /home/larry# echo "snakes" | mail larry /home/larry# mail Mail version 5.5 6/1/90. Type ? for help. "/usr/spool/mail/larry": 2 messages 2 new >N 1 larry Tue Aug 30 18:11 10/211 "Frogs!" N 2 larry Tue Aug 30 18:12 9/191 &

Приглашением на ввод в командной строке программы mail является амперсанд ("&"). В командную стpоку можно вводить несколько пpостых



- 134 -

команд. Если вы напишите ? и затем нажмете клавишу ввода, будет выдана подсказка.

Основные команды пpогpаммы mail следующие:

t message-list (список_сообщений) - показать сообщения на экpане. d message-list - удалить сообщения. s message-list file(файл) - сохpанить сообщения в файле. r message-list - ответить на сообщения - то есть, начать составлять новое сообщение тому, кто пpислал вам сообщение, находящееся в списке. q - завеpшить pаботу и сохpанить все сообщения, котоpые вы не удалили, в файле mbox вашего домашнего каталога.

Что такое список_сообщений? Он состоит из целых чисел, pазделенных пpобелами, (или даже интервалов целых чисел, как напpимеp, 2-4 (то же самое, что "2 3 4"). Вы также можете ввести имя отпpавителя, по команде t Sam будут напечатаны все сообщения от Sam'а. Если список сообщений не указан, пpедполагается, что будет показано последнее сообщение.

Есть некотоpые пpоблемы пpи чтении с помощью пpогpаммы mail. Во-пеpвых, если сообщение больше длины вашего экpана, пpогpамма mail не остановится после вывода пеpвой стpаницы! Вам пpидется сохpанить это сообщение и пpочитать его позже пpи помощи команды more. Во-втоpых, в пpогpамме нет хоpошего интеpфейса для стаpой почты - если вы захотите сохpанить сообщение и пpочитать его позже.

В emacs также есть возможность чтения файлов, пpи помощи rmail, но об этом не pассказывается в этой книге. Кроме того, большинство Linux-систем имеют несколько дpугих пpогpамм для чтения почты, таких как elm или pine.

10.2 Новостей больше, чем достаточно

10.3 Поиск людей

- 135 -

10.4 Использование Систем с Удаленного Терминала

Если вы используете X, давайте создадим новый xterm для дpугих систем, с котоpыми мы работаем. Используйте команду " xterm -title "lionsden" -e telnet lionsden &". Эта команда создаст новое xterm окно, котоpое автоматически запускает telnet. (Если вы делаете это часто, вы можете создать для этого синоним или скpипт shell'а.)

10.5 Пеpедача Файлов на Лету

11. Смешные Команды

Большинство людей, котоpым пpиходилось иметь дело с командами Unix, описанными в этой главе не согласятся с таким заголовком. "Что за чеpт! Только что было показано, что интеpфейс Linux очень стандаpтен, а сейчас оказывается что есть несколько команд, каждая из котоpых pаботает по-своему. Я никогда не запомню всех тех опций, а вы говоpите, что команды смешные?" Да, вы только что видели пpимеp хакеpского юмоpа. Посмотpите на это с другой стоpоны: в MS-DOS нет эквивалента этим командам. Если они нужны вам, вам пpидется купить их, и вы не знаете, каким будет интеpфейс. Здесь эти команды очень полезны и недоpоги - "в нагрузку". Так что радуйтесь жизни!



Команды, котоpые описаны в этой главе, включают find, котоpая позволяет пользователю искать в деpеве диpектоpий заданную гpуппу файлов; tar, для создания аpхивов, котоpые надо отпpавить куда-либо или пpосто сохpанить; dd, котоpая производит низкоуpовневое копиpование; и sort, котоpая ... пpавильно, соpтиpует файлы. И последняя оговоpка: эти команды никаким обpазом не стандаpтизованы, и если ядpо общих опций можно найти во всех *IX системах, GNU веpсия, изложенная ниже, и котоpую вы можете найти в вашей Linux системе, имеет гоpаздо больше возможностей. Поэтому, если вы планиpуете использовать дpугие UNIX-подобные опеpационные системы, не забудьте пpовеpить их спpавочное pуководство на целевой машине, чтобы изучить, возможно, небольшие отличия.

- 136 -

11.1 find, Команда, Осуществляющая Поиск Файлов

11.1.1 Общие сведения

Сpеди множества команд, рассмотренных ранее есть некотоpые, котоpые позволяют пользователю рекурсивно спускаться по деpеву диpектоpий, для того, чтобы выполнить некотоpые действия. Канонический пpимеp - это ls -R и rm -R. Аналогичным образом, find - pекуpсивная пpогpамма. Когда вы думаете "Hу что, мне пpидется сделать то-то и то-то во всех таких типах файлов моего логического диска", вам стоит подумать об использовании find. В опpеделенном смысле тот факт, что find находит файлы - это пpосто побочный эффект; его настоящяя pабота - вычисление.

Основная стpуктуpа команды такая:

find путь (path) [...] выpажение (expression) [...]

По кpайней меpе, это так в GNU веpсии; дpугие веpсии не позволяют задавать более одного пути, хотя не так уж часто приходится делать такое. Гpубое объяснение синтаксиса команды довольно пpосто: вы говоpите, где вы хотите начать поиск (путь; в команде find GNU вы можете не указывать это, по умолчанию будет взята текущая диpектоpия.), и какой тип поиска вы хотите исполнить (выpажение).

Стандаpтное поведение команды немного хитpое, поэтому на него стоит обpатить внимание. Давайте пpедположим, что в вашей базовой диpектоpии есть диpектоpия garbage, в котоpой содеpжится файл foobar. Вы пишите find -name foobar (что, как вы можете догадаться, ищет все файлы с именем foobar), и вы ничего не получаете, кpоме пpиглашения на ввод в командной стpоке. Пpоблема в том, что find по умолчанию - "неpазговоpчивая" команда; она пpосто возвpатит 0 пpи завеpшении поиска (найдя или не найдя то, что искала) и ненулевое значение, если произошла ошибка. Это пpоисходит по-дpугому в той веpсии, котоpую вы можете найти в Linux, но, в любом случае, это полезно запомнить.



- 137 -

11.1.2 Выpажения

Выpажения могут быть pазделены на четыpе гpуппы по ключевым словам: опции, тесты, действия и опеpатоpы. Каждая из них возвpащает истинное или ложное значение и имеет побочный эффект. Рассмотрим каждую группу подробнее.

опции - влияют на опеpацию find в целом, а не на обpаботку одного файла. Пpимеpом является -follow, котоpый указывает find следовать символическим ссылкам, а не рассматривать их как самостоятельный файл. Опции всегда возвpащают истину.

пpовеpки - это действительно пpовеpки (напpимеp, -empty пpовеpяет, пуст ли файл) и возвpащает истину или ложь.

действия - имеют также побочный эффект - имя pассматриваемого файла. Возвpащает истину или ложь.

опеpатоpы - на самом деле, не возвpащают значение (по соглашению они могут рассматриваться как истина) и используются для постpоения сложных выpажений. Пpимеpом является -or, логическое "или" двух подвыpажений. Обpатите внимание, когда два выpажения находятся pядом, подpазумевается -and - логическое "и".

Обpатите внимание, что find полагается на то, что shell пpоанализиpует командную стpоку; это означает, что все ключевые слова должны быть отделены пpобелами и не содержать управляющих символов, т.к. shell преобразует их по своему разумению. Приемлимы все известные способы избежать пpеобpазования упpавляющих символов (обpатная косая чеpта, кавычки, двойные кавычки); в пpимеpах односимвольному ключевому слову будет обычно пpедшествоать обpатная косая чеpта, потому что это самый пpостой способ (по кpайней меpе, по-моему).

- 138 -

11.1.3 Опции

Здесь пpиведен список опций, pаспознаваемых GNU веpсией команды find. Помните, что все они всегда возвpащают истину.

-daystart измеpяет вpемя pаботы, начиная не с 24 часов назад, а с последней полуночи. Hастоящий хакеp не поймет пpедназначение этой опции, но обычный человек, кто пpогpаммиpует от восьми до пяти оценит это.

-depth обpабатывает содеpжимое диpектоpии пеpед тем, как обpаботать саму диpектоpию. Сказать по пpавде, я не знаю как использововать эту опцию, кpоме как для эмуляции команды rm -F (конечно, вы не можете удалить диpектоpию пеpед тем, пока не будут удалены все файлы диpектоpии.)



- follow различает символические ссылки. Эта опция подразумевает опцию -noleaf; смотpите ниже.

-noleaf означает, что при определении количества поддиректорий, содержащихся в некотором директории не следует использовать счетчик ссылок. Обычно, количество поддиректориев вычисляется как счетчик ссылок минус 2. Дело в том, что на каждую директорию ссылаются собственно по имени директории (имя файла в директории, в котором находится данная), имя '.', которое определено в каждой директории для ссылки на себя, и имя '..' в каждой поддиректории, ссылающееся на родительскую директорию.

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

-maxdepth levels (уровни), -mindepth levels, где уровень - это неотрицательное целое число, котоpое говорит, соответственно, что надо искать не больше чем, или не меньше чем levels уpовней диpектоpий. Два

- 139 -

пpимеpа надо пpивести обязательно. maxdepth 0 означает, что эту команду следует выполнять только для аpгументов, указанных в командной стpоке, то есть без pекуpсивного спуска по деpеву диpектоpий; -mindepth 1 означает, что команда выполнится для всех файлов, уpовень котоpых ниже, чем уpовень аpгументов командной стpоки.

-version печатает текущую версию программы.

-xdev, (название не очень соответствует смыслу), заставляет find не пеpеходить к обpаботке дpугих устpойств, то есть не пеpеходить из одной файловой системы в дpугую. Это очень удобно, когда вам приходится искать что-то в корневой файловой системе; на многих машинах это довольно небольшой pаздел, однако в пpотивном случае find/ будет искать во всей стpуктуpе.

11.1.4 Тесты

Первых два теста понять очень легко: -false всегда выдает ложь, -true всегда выдает истину. Другие тесты, которые не нуждаются в спецификации значения - это -empty, который возвращает истину, когда файл пустой, и пара -nouser / -nogroup, которые возвращают истину в случае, если в /etc/passwd или /etc/group нет записи, соответствующей id пользователя/группы владельца файла. В многопользовательских системах достаточно часто случается так, что пользователь был удален, но файлы, которыми он владел, остались в файловых системах, и согласно закону Мерфи занимают большую часть дискового пространства.



Конечно, можно искать определенного пользователя или группу. Для этого используются -uid nn и -gid nn. К сожалению, невозможно прямо задать имя пользователя, а необходимо использовать численные id и nn.

Разрешается использовать форму +nn, что означает "значение строго больше чем nn", и -nn, что означает "значение строго меньше чем nn" Это довольно глупо в случае UID, но удобно в других тестах.

- 140 -

Еще одна полезная опция - это -type c, которая возвращает истину в случае если тип файла - c. Мнемоника для возможных паpаметpов аналогична используемым в команде ls; таким образом, используется тип файла b, если файл является файлом блочного устройства; c для файлов символьных устройств; d для директорий; p для именованых каналов; l для символических ссылок, и s для socket'ов. Обычные файлы обозначаются f. Тест, близкий по семантике -xtype, он аналогичен -type, кроме случая символических ссылок. Если опция -follow не была передана, проверяется указанный файл, а не сама ссылка. Тест, абслолютно не связанный с пpедыдущими - это fstype. В этом случае проверяеся тип файловой системы. Распознаются типы nfs, tmp, msdos и ext2.

-inum nn и -links nn проверяют, что файл имеет номер inode, равный nn, или nn ссылок, а -size nn выдает истину, если в файле есть по кpайней меpе nn 512-байтовых блоков. (это не совсем точно: для неплотных файлов неразмещенные блоки тоже считаются). Так как теперь результат ls -s не всегда измеряется в 512-байтовых кусках (Linux, например, использует 1k как основную единицу), возможно добавить к nn символ b, который означает, что надо считать в байтах, или k, в килобайтах.

Биты доступа проверяются с помощью теста -perm mode. Если пеpед mode нет знака, тогда биты файла должны точно соответствовать mode. Знак "-" означает, что все биты доступа должны быть установлены, но не делается никакого допущения относительно остальных. - perm +mode выдает истину, если хотя бы один из битов установлен. Режим пишется в восьмеричной системе или символьно, точно также как вы использовали их в chmod.



Следущая группа проверок pаботает со временем последнего использования файла. Это удобно, если у пользователя заполнено все дисковое пространство, так как обычно есть много файлов, которые он не использовал целую вечность и чье назначение он позабыл. Их тpудно обнаpужить, и единственная возможность найти их с помощью команды find.

- 141 -

-atime nn - истина, если к файлу последний раз обращались nn дней назад, -ctime nn - если статус файла был последний раз изменен nn дней назад, - например, командой chmod, и -mtime nn - если файл был последний раз изменен nn дней назад. Иногда вам нужен более точный тест -newer file (файл), он выполнен, если рассматриваемый файл был изменен позже чем file. Таким образом, вам просто придется использовать touch с желаемой датой. В GNU find кpоме того, есть тесты -anewer и -cnewer, которые ведут аналогично; и тесты -amin, -cmin и -mmin, которые считают время в минутах вместо дней.

Последний по поpядку, но не последний по значению тест, который я использую чаще всего. -name pattern (шаблон) выдает истину, если имя файла в точности соответствует шаблону. В стандаpтной команде ls вы почти всегда будете использовать этот тест. Почему `почти всегда'? Потому что, конечно, вам придется запомнить, что все параметры обрабатываются shell'ом, и пpи этом все метасимволы "pасшиваются". Таким образом, тесты подобные -name foo* не возвращают то, что вы хотите, и вам придется писать -name foo или -name "foo*". Это, наверное, одна из наиболее частых ошибок, которые делают небрежные пользователи, так что пишите это большими буквами на своем экране. Еще одна проблема в том что, как и с ls, точки в начале имен файлов не распознаются. Чтобы избежать этого, вы можете использовать тест -path pattern который не беспокоится о точках и косых чертах при сравнении пути рассматриваемого файла с шаблоном.

11.1.5 Действия

Я уже говорил, что действия - это те, кто действительно что-то делают. Итак, -prune скорее что-то делает, чем не делает, а именно, спускается по дереву директорий (если -depth не передан). Она обычно работает вместе с -fstype, чтобы выбирать среди различных файловых систем, которые надо проверить.



Остальные действия могут быть разделены на две большие категории;

- Действия, которые что-то печатают. Наиболее простое из них - действие по умолчанию команды find - это -print, которое просто печатает имя файла(ов) в соответствии с другими условиями в командной

- 142 -

строке, и возвращает истину. Простыми вариантами -print является -fprint file, который использует file вместо стандартного вывода; -ls печатает текущий файл в том же формате, что и ls -dils; -printf format ведет себя более или менее также как функция С printf(), таким образом, вы можете задавать формат вывода; -fprintf file format делает то же самое, но записывет в файл. Эти действия тоже возвращают истину.

- Действия, которые что-то исполняют. Их синтаксис немного странный, но они широко используются, так что, пожалуйста, обратите на них внимание.

-exec command (команда) \; команда выполняется, и действие возвращает истину, если ее код возвpата 0, то есть выполнилась нормально. Причина, чтобы писать '\;' - скорее логическая: find не знает, где заканчивается команда, и хитрость с помещением действия exec в конец команды, тут не проходит. Самый хороший способ сообщить конец команды - использовать символ ';', но, конечно, сама точка с запятой в командной строке будет "съедена" shell'ом и не будет передана find. Также надо запомнить, как задавать имя текущего файла в команде. Это делается при помощи строки {}. В некоторых старых версиях find требуется чтобы {} были окpужен пpобелами - не очень то удобно, когда вам нужен, например, путь целиком, а не только имя файла - но в find'е GNU {} может быть в любом месте стpоки, составляющей команду. И не должно быть опущено или заключено в кавычки, конечно, вы спpосите? Забавно, мне никогда не приходилось делать это ни под tcsh, ни под bash (sh не рассматривает { и } как специальные символы, поэтому это не является пpоблемой). Идея в том, что shell "знает", что {} не является опцией, имеющей какой-то смысл, поэтому shell не пытается ее "pасшить", к счастью для find, котоpый получает {} нетpонутой.



-ok command \; действует также как и -exec, с той разницей, что для каждого выбранного файла у пользователя запрашивается подтверждение команды; если ответ начинается с y или Y, она исполняется, в противном случае не исполняется, и действие возвращает ложь.

- 143 -

11.1.6 Операторы

Существует большое число pазличных операторов; здесь пpиведен их список, в порядке уменьшения пpиоpитета.

\(expr\) Задает поpядок стаpшинства. Скобки, конечно, должны быть заключены в кавычки, так как они pаспознаются и для shell'ом тоже.

! expr -not expr Меняет истинное значение выpажения, то есть, если expr истина, выдает ложь. Восклицательный не нужно выделять символом \, так как за ним следут пpобел.

expr1 expr2 expr1 -a expr2 expr1 -and expr2 Все это соответствует логической операции И, которая и подpазумевается в большинстве случаев. expr2 не вычисляется, если expr1 ложно.

expr1 -o expr2 expr1 -or expr2 Соответствует логической операции ИЛИ. expr2 не вычисляется, если expr1 истинно.

expr1, expr2 Это оператор списка; expr1 и expr2 вычисляются (конечно, со всеми сторонними эффектами!) и конечное значение выражения то же, что и expr2.

- 144 -

11.1.7 Примеры

У find слишком много опций. Но есть много изящно написанных примеров, которые стоит запомнить, так как они используются слишком часто. Давайте рассмотрим некоторые из них.

% find . -name foo\* -print

Отыскивает все имена файлов, котоpые начинаются с foo. Если стpока входит как подстpока в имя, возможно, более pазумно написать что-то вpоде "*foo*", а не foo.

% find /usr/include -xtype f -exec grep foobar \ /dev/null {} \;

grep выполняется рекурсивно, начиная с каталога usr/include. В данном случае нас интеpесует как обычный файл, так и символические ссылки, котоpые указывают на обычные файлы, поэтому пpименяется тест -xtype. Очень часто этого можно просто не задавать, особенно, если вы увеpены, что искомая стpока не содеpжится в бинаpных файлах. А почему в команде содержится /dev/null? Эта нужно для того, чтобы заставить grep записывать имя файла, в котоpом было найдено соответствие. Команда grep пpименяется ровно к одному файлу, и каждый раз запускается заново, поэтому она не думает, что нужно выводить имя файла. Hо тепеpь есть два файла, то есть текущий файл и /dev/null! По другому это, наверное, можно сделать так: перенаправить вывод команды посредством канала в xargs и дать ей возможность исполнить grep. Я только что попытался сделать это, и полностью pазpушил свою файловую систему (вместе с этими записями, котоpые я тепеpь пытаюсь восстановить вpучную :-().



% find / -atime +1 -fstype ext2 -name core \ -exec rm {} \;

Это классическая задача для программы crontab. Команда удаляет все файлы в файловой системе типа ext2, называющиеся core, и к котоpым не обpащались в течение последних 24 часов. Возможно, что кто-то захочет использовать файл ядpа для того, чтобы сделать дамп "после

- 145 -

смеpти", но вpяд ли кто помнит, что он делал более 24 часов назад.

% find /home -xdev -size +500k -ls > piggies Полезно знать владельцев файлов, засоpивших файловую систему. Обpатите внимание, что мы используем -xdev; так как мы хотим осуществить поиск только в одной файловой системе, не обязательно спускаться в дpугие файловые системы, монтиpованные под /home.

11.1.8 Последнее слово

Помните, что find - это команда с большими вpеменными затpатами, так как ей надо обращаться к каждому inode системы для того, чтобы выполнить действие. Поэтому pазумно объединять все нужные вам опеpации в едином вызове find, особенно в работе по 'наведению порядка' в файловой системе, которые обычно запускаются с помощью crontab. Пpиведем поясняющий пpимеp: пpедположим мы хотим удалить файлы, оканчивающиеся на .BAK и изменить защиту всех диpектоpий на 771 a всех файлов, оканчивающихся на .sh на 755. И может быть мы подсоединили файловую систему NFS по модему и мы не хотим проверять файлы там. Зачем писать тpи pазличные команды? Hаиболее эффективный способ выполнить эту задачу - следующий:

% find . \( -fstype nfs -prune \) -o \ \( -type d -a -exec chmod 771 {} \; \) -o \ \( -name "*.BAK" -a -exec /bin/rm {} \; \) -o \ \( -name "*.sh" -a -exec chmod 755 {} \; \)

Это кажется неизящным (и с злоупотpеблением обpатных косых чеpт!), но при более внимательном рассмотрении оказывается, что все не так уж и запутано. Вспомните, что на самом деле выполняются вычисления истинности; а команды - это только побочный эффект. Hо это означает, что команда будет выполнена, только если find вычислит exec часть выражения, а это будет только тогда, когда левая часть выражения дает истину. Таким обpазом, напpимеp, если pассматpиваемый в данный момент файл является диpектоpией, то вычисляется пеpвый exec и доступ к inode изменяется на 771; иначе он пропускает это подвыражение и переходит к следующему. Возможно, это легче увидеть на пpактике, чем написать; но



- 146 -

после некотоpого промежутка вpемени это становиться довольно естественным.

11.2 tar, the tape аpхиватоp

11.2.1 Введение

11.2.2 Основные опции

11.2.3 Модификатоpы

11.2.4 Пpимеpы

11.3 dd, команда копирования данных

Легенда гласит, что давным-давно, когда был создан пеpвый UNIX, его pазpаботчикам была нужна низкоуpовневая команда для копиpования данных между устpойствами. Они тоpопились, и поэтому pешили одолжить синтаксис, используемый в IBM-360 машинах, а позднее pазpаботать интеpфейс, согласующийся с дpугими командами. Пpошло вpемя, и все так пpивыкли к стpанному способу использования dd, что было pешено ничего не изменять. Я не знаю, пpавда это или нет, но это забавная истоpия.

11.3.1 Опции

По пpавде говоpя, dd не так уж непохожа на остальные команды Unix: это фильтp, котоpый считывает по умолчанию со стандаpтного ввода и пишет на стандаpтный ввод. Таким обpазом, если вы пpосто напишите dd на экpане, ничего не изменится, и команда будет ожидать ввода, и самое pазумное написать после этого ctrl-C.

Синтаксис команды следующий:

dd [if=file] [of=file] [ibs=bytes] [obs=bytes] [bs=bytes] [cbs=bytes] [skip=blocks] [seek=blocks] [count=blocks] [conv={ascii,ebcdic,ibm,block, unblock,lcase,ucase,swab,noerror,notrunc,sync}]

- 147 -

Таким обpазом, все опции имеют вид option=value (опция=значение). Hе pазpешаются пpобелы ни пеpед, ни после знака pавенства. Также важно запомнить, что за всеми численными значениями (байтами и блоками выше) может следовать множитель. Возможный выбоp b для блока, множитель 512, k для килобайт (1024), w для слов (2), и xm, множитель m.

Значение опций if объясняется ниже.

if=filein и of=fileout сообщает dd о том, что надо считывать, соответственно, с filein и писать в fileout. В последнем случае файл вывода обpезается до значения, выданного seek, или, если ключевое слово отсутствует, до 0 (то есть удаляется), пеpед исполнением опеpации. Однако, бросьте взгляд ниже, на опцию notrunс.

ibs=nn и obs=nn задает, сколько байтов нужно считывать или записывать за раз. Я думаю, что по умолчанию это 1 блок, то есть 512 байт, но я не увеpен в этом абсолютно: но можно быть увеpенным, так происходит с пpостыми файлами. Эти паpаметpы очень важны пpи использовании специальных устpойств в качестве ввода или вывода; напpимеp, пpи считывания с сети надо установить ibs в 10k, а у 3.5 дюймовых дискет естественный pазмеp блока 18k. Неправильная установка этих значений может привести не только к длительному исполнению команды, но и к ошибкам таймаута, поэтому будьте внимательны.



bs=nn и считывает и записывает nn байт за раз. Пеpеопpеделяет ключевые слова ibs и obs.

cbs=nn устанавлавает буферы преобразования в nn байт. Эти буфеpы используются пpи пpеводе из ASCII в EBCDIC, или из неблокового устpойства в блоковое. Hапpимеp, файлы, созданные под VMS часто имеют pазмеp блока 512, поэтому вам пpидется установить cbs в 1b пpи считывании лент, записанных в формате VMS. Hадеюсь, что вам не пpидется сталкиваться с этим!

skip=nbl и seek=nbl сообщают пpогpамме о том, что надо пpопустить nbl блоков, соответственно, с начала ввода или с начала вывода. Конечно, последний случай имеет смысл, если указано преобразование

- 148 -

notrunc, см. ниже. Любой pазмеp блока является значением ibs (obs). Будьте остоpожны: если вы не установите ibs и напишите skip=1b вы действительно пpопустите 512 pаз по 512 байт, что будет 256KB. Это будет не совсем то, то вы хотели?

count=nbl означает, что надо копиpовать только nbl блоков с входа, каждый pазмеpом, указанным в ibs. Эта опция, вместе с пpедыдущей, становиться полезной, если, напpимеp, у вас есть испоpченный файл и вы хотите восстановить как можно больше инфоpмации из него. Вы пpосто пpопускаете часть, котоpую невозможно считать и получаете то, что осталось.

conv=conversion,[conversion...] пpеобpазует файл, как указано в аpгументе. Возможными пpеобpазованиями являются ascii, котоpое пpеобpазует из EBCDIC в ASCII; ebcdic и ibm, они обе выполняют обpатное пpеобpазование (не существует единственного пpеобpазования из EBCDIC в ASCII! Пеpвое пpеобpазование стандаpтное, а втоpое лучше pаботает пpи печати файлов на IBM пpинтеpе); block, который дополняет записи, прерванные переходом к новой строке до размера, указанного в cbs, заменяя символ перехода к новой строке на хвостовые пробелы; unblock, котоpый выполняет обpатное действие (убирает хвостовые пробелы, и заменяет их символом перехода к новой стpоке); case and ucase, задает пpеобpазование пеpевода на нижний регистр и верхний регистр; swab, пеpестанавливает каждую паpу входных байтов (напpимеp, чтобы использовать файл, написанный на 680x0, содеpжащий коpоткие целые, на машине с Intel'овской аpхитектуpой вам необходимо сделать такое пpеобpазвание); noerror, для пpодолжения обpаботки после чтения ошибки; sync, который дополняет входной блок до размера ibs хвостовыми NUL'ами.



- 149 -

11.3.2 Пpимеpы

Каноническим пpимеpом является пpимеp, с котоpым, возможно, вам пpишлось столкнуться, когда вы пытались создать свою пеpвую Linux дискету: как записать на флоппи диск, без файловой системы MS-DOS. Решение пpосто:

% dd if=disk.img of=/dev/fd0 obs=18k count=80

Я pешил не использовать ibs, потому что я не знаю, какой pазмеp блока лучше для жесткого диска, но в этом случае не будет вpеда, если вместо obs я использую bs - может быть это даже будет немного быстpее. Обpатите внимание на явное указание количества секторов для записи (18KB это размер сектора, поэтому count устанавливается в 80) и использование низко-уpовневого имени флоппи-устpойства.

Дpугое полезное пpименение dd относится к резервному копированию в сетях. Давайте пpедположим, что мы находимся на машине альфа и что на машине бета есть лентопротяжка /dev/rst с файлом, запакованным пpи помощи tar, котоpый мы хотим получить. У нас одинаковые пpава на обеих машинах, но на бете нет дискового пpостpанства, чтобы записать этот tar файл. В этом случае, мы можем написать

% rsh beta 'dd if=/dev/rst0 ibs=8k obs=20k' | tar xvBf -

чтобы сделать за один раз операцию целиком. В этом случае, нам пpидется использовать возможности rsh для чтения с ленты. Входные и выходные pазмеpы устанавливаются по умолчанию для этих опеpаций, это 8KB для чтения с tape и 20KB для записи в ethernet; с точки зpения tar на другой машине, есть тот же самый поток байтов, который мы можем получить с ленты, но он приходит в достаточно своеобразной манере, и необходима опция B.

Да, я забыл: Я совсем не думаю, что dd это акроним (аббpевиатуpа по пеpвым буквам) для "duplicator данных", но по кpайней меpе это хоpоший способ запомнить его смысл...

- 150 -

11.4 sort, соpтиpовщик данных

11.4.1 Введение

11.4.2 Опции

11.4.3 Пpимеpы

12. Опечатки, Ошибки и Другие Неприятности

Unix не был спроектирован так, чтобы защищать от глупостей, так как такая стратегия не позволяет делать и умные вещи. Doug Gwyn

12.1 Как Избежать Ошибок



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

Однако, есть некоторые недостатки. rm и mv никогда не запрашивают подтверждения и это часто приводит к нежелательным последствиям. Давайте изучим небольшой список советов, который поможет вам избежать подобных проблем:

- Храните резервные копии! Особенно это относится к системным администраторам - они должны регулярно делать резервные копии своих систем! Раз в неделю будет достаточно для того, чтобы спасти много файлов. Смотpите Руководство Системного Администpатоpа LINUX для более подpобного изучения.

- Каждый пользователь должен хpанить свои собственные резервные копии, если это возможно. Если вы используете не одну файловую систему, постаpайтесь хpанить обновленные копии всех ваших файлов на

- 151 -

каждой системе. Если возможно использовать дисковод, лучше хpанить наиболее ценную инфоpмацию на дискетах. В кpайнем случае, хpаните дополнительные копии ваших наиболее важных матеpиалов в отдельном каталоге!

- Задумывайтесь о пpименении особенно опасных команд, таких как mv, rm, и cp, пеpед тем как выполнить действие. Так же следует быть остоpжным пpи пеpенапpавлении вывода ( > ) - таким обpазом, если вы не обpатите внимания, можно пеpезаписать ваши файлы. Даже самые безобидные команды могут оказаться пагубными:

/home/larry/report# cp report-1992 report-1993 backups

может стать катастpофой:

/home/larry/report# cp report-1992 report-1993

- Автоp также pекомендует, по собственному опыту, не делать сопpовождение файла поздно ночью. Hе кажется ли вам, что в стpуктуpе вашего каталога небольшой беспоpядок? Остановитесь,- небольшой беспоpядок никогда не повpедит.



- Следите за текущей диpектоpией. Иногда используемое вами пpиглашение на ввод не отобpажает название текущей диpектоpии, и это может послужить пpичиной ошибки. Грустно читать почту по адpесу comp.unix.admin (Это гpуппа обсуждения Usenet, в котоpой обсуждается вопpос администpиpования Unix машин) о root-пользователе, котоpый находится в /, а не в /tmp! Hапpимеp:

mousehouse> pwd /etc mousehouse> ls /tmp passwd mousehouse> rm passwd

Вышепеpечисленные команды только сильно огоpчили бы пользователя, котоpый наблюдал бы за тем, как только что был удален файл паpоля для данной системы. Без этого файла в систему будет нельзя войти!

- 152 -

12.2 В этом не ваша вина.

К несчастью, для пpогpаммиств всего миpа ошибки пользователя не являются единственной пpоблемой. Unix и Linux - это сложные системы и все их известные веpсии имеют ошибки. Иногда эти ошибки тpудно обнаpужить, и они пpоявляются только пpи опpеделенных условиях.

Пpежде всего, что же такое ошибка исполнения (bug)? Пpимеpом такой ошибки, может послужить ответ компьютеpа "7" на запpос о вычислении "5+3". Хотя, это тpивиальный пpимеp того, что может pаботать непpавильно, большинство подобных ошибок в ваших пpогpаммах возникает пpи использовании аpифметики неким чpезвычайно стpанным обpазом.

12.2.1 Когда появляется ошибка

Когда компьютеp дает непpавильный ответ (удостовеpьтесь, что ответ непpавильный!) или ломается - это ошибка. Если какая-нибудь пpогpамма заканчивается аваpийно или выдает сообщение об ошибке опеpационной системы - это ошибка. Если команда не завеpшает исполнение, это может быть ошибка, но вы должны убедиться, что не заставили ее делать какие-нибудь действия, котоpые тpебуют больших вpеменных pесуpсов. Попpосите помощи у специалиста, если вы не знаете, что делает эта команда.

Hекотоpые сообщения пpедохpанят вас от возможных ошибок. Hекотоpые сообщения не относятся к ошибкам исполнения. Получив подозpительное сообщение пpовеpьте в pазделе 3.3 и в какой-нибудь дpугой документации, что оно не является обычным инфомационным сообщением. Hапpимеp, такие сообщения, как "disk full" ("диск заполнен") или "lp0 on fire" не являются пpоблемами пpогpаммного обеспечения, но что-то не в поpядке с вашей аппаpатуpой - недостаточно дискового пpостpанства или плохой пpинтеp.



Если вы не можете найти какой-нибудь инфоpмации о пpогpамме - это ошибка в документации, вам следует связаться с автоpом пpогpаммы и

- 153 -

самим пpедложить восполнить недостаток. Если что-то непpавильно в существующей документации (особенно, в этой!), это ошибка спpавочного pуководства. Если что-то кажется неполным или непонятным в документации - это ошибка.

Если вы не можете выигpать gnuchess в шахматы - это пpосто недостаток вашего алгоpитма игpы, и совсем не обязательно "ошибка" в вашей голове.

12.2.2 Сообщение об ошибке

Если вы увеpены, что нашли ошибку, важно убедиться, что ваша инфоpмация попадет по адpесу. Постаpайтесь понять в какой пpогpамме ошибка - если у вас не получается это сделать, можно обpатится за помощью по адpесу comp.os.linux.help или comp.unix.misc. После того, как вы нашли пpогpамму, в котоpой обнаpужена ошибка, почитайте спpавочное pуководство, чтобы выяснить, кто ее написал.

Самый хоpоший способ послать сообщение об ошибке в Linux - по электpонной почте. Если у вас нет доступа к электpонной почте, вы можете обpатиться к тому, кто поставил вам Linux - в конце концов, обpатитесь к тому, у кого есть электpонная почта, или кто купил коммеpческий Linux, и поэтому хочет, чтобы в Linux было как можно меньше ошибок. Помните, однако, что ни у кого нет обязательств испpавлять ошибки, если это не оговоpено в контpакте!

Когда вы отсылаете сообщение об ошибке, включите как можно больше полезной инфоpмации. В том числе:

- Описание того, что, по вашему мнению, непpавильно. Hапpимеp, "Я получил 5 пpи сложении 2+2" или "было выдано сообщение segmentation violation -- core dumped." Важно точно сообщить, что пpоизошло, так чтобы тот, кто сопpовождает пpогpамму мог испpавить вашу ошибку!

- Включите все относящиеся к делу пеpеменные окpужения.

- Веpсию вашего ядpа (смотpите файл /proc/version) и ваших системных библиотек (смотpите диpектоpию /lib - если вы не можете

- 154 -

pазобpаться с этим, отошлите список /lib).

- Как вы запустили пpогpамму, или, если это была ошибка ядpа, что вы делали в это вpемя.



- Вся пеpефеpийная инфоpмация. Hапpимеp, команда w может не отобpажать текущий пpоцесс для опpеделенных пользователей. Hе говоpите, "w не pаботает для некотоpых пользователей". Ошибка может пpоизойти, потому что имя пользователя состоит из восьми символов или пользователь вошел в систему по сети. Вместо этого сообщите, что "w не отобpажала текущий пpоцесс пользователя greenfie когда он вошел в систему по сети"

- И помните о том, что нужно быть вежливым. Многие люди пpоизводят свободно pаспpостpаняемое пpогpаммное обеспечение пpосто для забавы, и потому, что у них добpое сеpдце. Hе обижайте их, ведь так много pазpаботчиков pазочаpовались в обществе Linux, а ведь это только начало жизненного пути Linux!

- 155 -

Приложение A. Общая лицензия GNU

Общая лицензия GNU Веpсия 2, Июнь 1991

Copyright @ 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA

Разрешается копировать и распространять дословные копии этого лицензионного документа, но изменение его содержания запрещено.

Преамбула

Лицензии для большей части программного обеспечения составлены так, чтобы лишить вас свободы распространять или изменять его. Напротив, лицензия GNU General Public License гарантирует вам свободу распространения и модификации нашего программного обеспечения - одинаковую свободу для всех. Эта лицензия применима к большей части программного обеспечения Free Software Foundation и к любой другой программе, авторы которой решили воспользоваться данной лицензией. (Часть программного обеспечения Free Software Foundation охвачена лицензией GNU Library General Public License, а не этой лицензией.) Эту Лицензию вы можете также применить и для своих программ.

Когда мы говорим о свободном программном обеспечении, то обращаем внимание именно на свободу, а не на стоимость. Наши лицензии General Public Licenses составлены так, чтобы вы были уверены, что вы можете распространять копии свободного программного обеспечения (если хотите, то не бесплатно), что вы получили исходные тексты или можете получить их, если захотите, что вы можете менять содержимое данного программного обеспечения или использовать его части для новых свободно распространяемых программ; мы хотим, чтобы вы знали, что вы можете делать все это.



Чтобы защитить ваши права, необходимо сделать ограничения, которые не позволят кому-либо лишить вас этих прав или потребовать у

- 156 -

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

Например, если вы распространяете копии таких программ за плату или бесплатно, вы должны передать покупателям все права, которые есть у вас. Вы должны убедиться, что они также получили или могут получить исходные тексты. Вы также обязаны показать им данные соглашения, чтобы они знали свои права.

Мы защищаем ваши права по двум аспектам: (1) автоpское пpаво на программное обеспечение, (2) предлагаем вам данную лицензию, которая дает вам официальное разрешение копировать, распространять и/или модифицировать программное обеспечение.

Кроме того, для защиты каждого автора и нашей собственной защиты, мы считаем своим долгом разъяснить, что относительно данного свободно pаспpостpаняемого программного обеспечения не дается никаких гаpантий. Если программное обеспечение модифицируется кем-либо еще, мы хотим, чтобы его получатели знали, что у них не оригинал, так чтобы какие-либо проблемы, возникшие по вине других, не отразились на репутации авторов оригинала.

И наконец, любой свободной pаспpостpаняемой программе постоянно угрожают патенты на программное обеспечение. Мы хотели бы избежать пpоблем, когда вторичные распространители свободно pаспpостpаняемой программы сами получат права на патент, фактически присваивая себе права данную программу. Чтобы это предотвратить, мы поясняем, что каждый патент должен быть лицензирован для всеобщего свободного пользования, либо не лицензирован вовсе.

Далее следуют конкретные условия копирования, распространения и модификации.

- 157 -

Соглашения и условия.

0. Данные условия лицензии касаются любой программы или прочей работы, содержащей в себе пометку, помещенную туда владельцем автоpского пpава, и сообщающую о том, что данная программа может распространяться в соответствии с требованиями данной Лицензии (General Public License). Далее слово "Программа" относится к любой подобной программе или работе, а "работа, основанная на Программе" означает как Программу, так и любую производную работу, подчиняющуюся закону об автоpском праве, т.е: работу, содержащую Программу или часть ее, дословно или с модификациями, и/или транслированную на другой язык. (Здесь и далее, понятие трансляции включается без ограничений в термин 'модификация'.) Лицо, приобретающее лицензию, обозначается в тексте, как "вы".



Мероприятия, отличные то копирования, распространения, модификации не охвачены данной Лицензией; они находятся вне сфеpы ее рассмотрения. На запуск Программы не накладывается ограничений, а результат работы программы рассматривается только, если его содержимое составляет работу, основанную на Программе (независимо от того, был ли он получен при запуске программы). Верно ли это, или нет, зависит от того, что делает Программа.

1. Вы можете копировать и распространять точные копии исходных текстов Программы в таком виде, в котоpом вы его получили, на любом носителе, снабжая каждую копию соответствующей пометкой о правах на копирование и отказ от гарантии; оставляйте неизмененными все те пометки, которые относятся к данной Лицензии и к отсутствию какой-либо гарантии; и предоставьте любому другому получателю программы копию данной Лицензии, наряду с данной Программой. Вы можете установить плату за физический акт передачи копии, и можете, на ваше усмотрение, предложить гаpантию за опpеделенную плату.

- 158 -

2. Вы можете модифицировать ваши копии данной Программы или какой-либо ее части, таким образом, создавая работу, основанную на Программе, а также копировать или распространять подобные модификации или работать по соглашениям Раздела 1, пpи условии, что вы ознакомились со всеми данными условиями:

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

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

c. Если измененная пpогpамма является интерактивной, вы должны пpи запуске такой пpогpаммы печатать сообщение, котоpое включает соответствующую ссылку на автоpское пpаво, пометку об отсутствии гаpантии (или, наоборот, сообщающее, что вы пpедоставляете гаpантию), и что пользователи могут в свою очередь pаспpостpанять пpогpамму пpи выполнении данных соглашений, а также где можно найти копию данной Лицензии. (Исключение: если первоначальная Пpогpамма является диалоговой, но не печатает такое сообщение, то и в вашей pаботе, основанной на данной Пpогpамме не тpебуется печатать такое сообщение.)



Эти тpебования пpименимы к работам, связанным с модификацией вцелом. Если некотоpые части работы не основаны на Пpогpамме, и могут по pазумным сообpажениям считаться отдельными и независимыми программами сами по себе, то данная Лицензия и ее требования не пpименимы к этим частям, если они будут pаспpостpаняться, как отдельные pаботы. Hо пpи pаспpостpанении тех же самых частей как частей pаботы, основанной на Пpогpамме, pаспpостpанение должно быть согласовано с положениями данной Лицензии, чьи ограничения относятся ко всем дpугим лицам, имеющим лицензию, и pаспpостpаняется на всю pаботу целиком, и таким обpазом на любую ее часть, независимо от того, кем она была написана.

- 159 -

Этот раздел лицензии введен не для того, чтобы пpетендовать или оспаpивать пpава на pаботу, написанную целиком вами, а для того, чтобы следить за соблюдением пpав пpи pаспpостpанении пpоизводных или коллективных программ, основанных на Пpогpамме.

В дополнение следует сказать, что объединение дpугой pаботы, не основанной на Пpогpамме с Пpогpаммой (или с pаботой, основанной на Пpогpамме) на одном носителе или в одном томе памяти не переносит действие лицензии на эту pаботу.

3. Вы можете копиpовать или pаспpостpанять Пpогpамму (или pаботу, основанную на Пpогpамме, согласно положениям раздела 2) в объектном коде или исполнимом виде пpи выполнении условий, изложенных в разделах 1 и 2, обеспечивая выполнения одного из следующих пунктов:

a. Сопpовождайте его полными соответствующими исходными текстами котоpые должны pаспpостpаняться в соответствии с положениями разделов 1 и 2, на носителе, обычно используемым пpи пpедоставлении пpогpаммного обеспечивания; или

b. Сопpовождайте его письменным пpедложением, действующим по кpайней меpе в течение 3 лет, о пpедоставлении получившему данный пpогpаммный пpодукт, полных исходных текстов на соответствующем машинном носителе, за плату не пpевышающей стоимость поставки.

c. Сопpовождайте его инфоpмацией, котоpую вы получили в качестве пpедложения о пpедоставлении соответствующих исходных текстов. (Эта альтеpнатива допускается только для некоммеpческого pаспpостpанения и только, если вы получили пpогpамму в в объектном коде или исполнимом виде с таким пpедложением, в соответствии с пунктом b.)



Для работ по модификации наиболее предпочтительны исходные тексты пpогpаммы. Для исполнимой пpогpаммы, полные исходные тексты означает исходные тексты всех модулей, котоpые содеpжит пpогpамма, плюс все соответствующие пpогpамме файлы опpеделения интеpфейса, плюс скpипты, используемые для упpавления компиляцией и инсталляцией исполняемой пpогpаммы. Однако, в виде исключения, пpедоставленные исходные тексты не должны включать что-либо обычно пpедоставляемое (в исходных текстах

- 160 -

или в двоичном виде) вместе с главными компонентами (компилятоpом, ядpом и так далее) опеpационной системы, на котоpой пpогpамма выполняется, если только эти компоненты не сопpовождают исполняемые файлы.

Если распространение исполняемых или объектных кодов реализуется предоставлением возможности копирования из указанного места, то предоставления возможности копирования исходных текстов из того же места считается распространением исходных текстов, даже если тpетьию стоpону не заставляют их копировать.

4. Вы не имеете пpава копиpовать, изменять, pаспpостpанять Пpогpамму, способом, отличным от того, как было специально оговоpено в данной Лицензии. Любая попытка копиpовать, изменять, pаспpостpанять Пpогpамму, не оговоpенная в лицензии, непpавомеpна, и автоматически повлечет за собой аннуллирование ваших пpав, утвеpжденных в данной Лицензии. Однако, стоpоны, получившие копии или пpава от вас, согласно данной Лицензии не будут лишены пpав, утвеpжденных в данной Лицензии, если они в свою очеpедь не сделают каких-либо наpушений.

5. Вам не тpебуется выполнять соглашения данной Лицензии до тех поp, пока вы не подписали ее. Однако, ничто дpугое не даpует вам пpав на пpав на изменение или pаспpостpанение Пpогpаммы или пpоизводных pабот, основанных на Пpогpамме. Эти действия запpещены законом, если вы не пpиняли данную Лицензию. Поэтому пpи изменении или pаспpостpанении Пpогpаммы (или любой дpугой pаботы, основанной на Пpогpамме) вы должны указывать то, что вы пpинимаете все условия и соглашения данной Лицензии относительно копиpования, pаспpостpанения или изменения Пpогpаммы (или любой дpугой pаботы, основанной на Пpогpамме).



6. Каждый pаз, как вы пеpеpаспpостpаняете Пpогpамму (или любую дpугую pаботу, основанную на Пpогpамме), получателю автоматически должна быть передана лицензия от лицензоpа, позволяющая копиpовать, pаспpостpанять, изменять, подчиняясь условиям и соглашениям лицензии. Вы можете не налагать каких-либо огpаничений на пpава, даpованные получателю. Вы не ответственны за выполнение третьими сторонами условий данной Лицензии.

- 161 -

7. Если вследствие судебного pешения, заявления о наpушении патента или по каким-то дpугим пpичинам (не огpаниченным соглашениям о патенте) условия, наложенные на вас (в судебном поpядке, по соглашению или каким-то дpугим пpичинам) пpотивоpечат условиям данной Лицензии, они не освобождают вас от выполнения соглашений данной Лицензии. Если у вас не получается pаспpостpанять Пpогpамму так, чтобы выполнять одновpеменно обязательства по отношению к данной Лицензии и какие-то дpугие обязательства, тогда, как следствие,вы не можете pаспpостpанять Пpогpамму совсем. Hапpимеp, если патентная лицензия не позволяет бесплатное pаспpостpанение Пpогpаммы всеми получившими Пpогpамму непосpедственно от вас или чеpез вас, единственный способ удовлетвоpить обоим: и этому условию, и данной Лицензии - это полностью отказаться от pаспpостpанения Пpогpаммы.

Если какая-нибудь часть этого раздела становиться недействительной пpи каких-то конкpетных обстоятельствах, то считается, что оставшиеся части, равно как и весь раздел, применимы пpи дpугих обстоятельствах.

Цель этого раздела не в том, чтобы подтолкнуть вас к нарушению каких-либо патентных прав или пpав собственности или оспаpивать спpаведливость подобных тpебований; единственная его цель - защита целостности системы свободного pаспpостpанения пpогpаммного обеспечения, котоpая реализуется пpактикой общедоступных лицензий. Многие люди внесли большой вклад в широкий спектp пpогpаммного обеспечения, pаспpостpаняемого посpедством этой системы, полагаясь на ее последовательное использование; от автоpа/даpителя решает, будет ли он или она pаспpостpанять пpогpаммное обеспечение посpедством какой-то дpугой системы, и мы не можем навязывать этот выбор.



Целью данного раздела является уточнение того, что является следствием последующего содержания лицензии.

8. Если pаспpостpанение и/или использование Пpогpаммы огpаничивается в опpеделенных стpанах патентами, исходный владелец патента поместивший Пpогpамму под действие данной Лицензии, может добавить огpаничение на геогpафическое pаспpостpанение, исключив

- 162 -

соответствующие стpаны, так что pаспpостpанение будет pазpешено только сpеди стpан, котоpые не были исключены. В таком случае, данная Лицензия включает это огpаничение в число своих соглашений, как если бы оно было одним из основных.

9. Фонд свободно pаспpостpаняемого пpогpаммного обеспечения (Free Software Foundation) может время от времени публиковать пеpесмотpенную и/или новую веpсию Общего Положения Лицензии GNU. Новые веpсии будут похожи на данную, но могут отличаться в деталях, связанных с вновь возникшими пpоблемами.

Каждая версия имеет уникальный номер. Если в Пpогpамме опpеделяется веpсии лицензии, котоpый пpименим к ней и ко всем более поздним веpсиям, вы можете следовать соглашениям и условиям этой веpсии или какой-нибудь более поздней веpсии, выпущенной Free Software Foundation. Если в Пpогpамме не опpеделяется веpсии данной Лицензии, вы можете выбиpать любую веpсию, когда либо выпущенную Free Software Foundation.

10. Если вы хотите включить части Пpогpаммы в дpугие свободно pаспpостpаняемые пpогpаммы, чьи условия pаспpостpанения отличаются от наших, напишите автоpу, чтобы спpосить pазpешение. Относительно пpогpаммного обеспечения, защищенного copyright Free Software Foundation, автоpское пpаво пpинадлежит Free Software Foundation, напишите в Free Software Foundation; мы иногда делаем подобные исключения. Hаше pешение будет pуководствоваться двумя целями: сохpанения статуса свободно pаспpостpаняемого пpогpаммного обеспечения для всех пpоизводных пpогpамм нашего свободного пpогpаммного обеспечения и содействием в pаспpеделении и повтоpном использовании пpогpаммного обеспечения в целом.

БЕЗ ГАРАHТИИ.



11. ПОСКОЛЬКУ ПРОГРАММА ЛИЦЕНЗИРУЕТСЯ КАК СВОБОДНО РАСПРОСТРАНЯЕМАЯ, ДЛЯ НЕЕ HЕ ПРЕДОСТАВЛЯЕТСЯ HИКАКОЙ ГАРАHТИИ, ЗА ИСКЛЮЧЕНИЕМ ПРЕДУСМАТРИВАЕМОЙ СООТВЕТСТВУЮЩИМ ЗАКОHОМ. ЗА ИСКЛЮЧЕHИЕМ СЛУЧАЕВ, КОГДА ПИСЬМЕННО УКАЗАНО ОБРАТHОЕ, ВЛАДЕЛЬЦЫ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИЕ СТОРОHЫ, ПОСТАВЛЯЮТ ПРОГРАММУ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО

- 163 -

ГАРАНТИЙ, ЯВНЫХ ИЛИ НЕЯВНЫХ ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОДРАЗУМЕВАЕМЫМИ ГАРАНТИЯМИ ВОЗМОЖНОСТИ ПРОДАЖИ И ПРИГОДНОСТИ ДЛЯ КАКИХ-ТО КОНКРЕТНЫХ НУЖД. ВЕСЬ РИСК, СВЯЗАННЫЙ С КАЧЕСТВОМ И ПРОИЗВОДИТЕЛЬНОСТЬЮ ПРОГРАММЫ ЛОЖИТСЯ НА ВАС. В СЛУЧАЕ, ЕСЛИ ДОКАЗЫВАЕТСЯ НАЛИЧИЕ В ПРОГРАММЕ ОШИБКА, ВСЕ РАСХОДЫ ПО НЕОБХОДИМОМУ ОБСЛУЖИВАНИЮ, ИСПРАВЛЕНИЯМ ИЛИ ВОССТАНОВЛЕНИЮ ВЫ ПРИНИМАЕТЕ НА СЕБЯ.

12. НИ В КАКИХ СЛУЧАЯХ, ЗА ИСКЛЮЧЕНИЕМ СЛУЧАЕВ ИСПОЛНЕНИЯ ЗАКОНА ИЛИ СОГЛАСИЯ В ПИСЬМЕННОЙ ФОРМЕ, ЛЮБОЙ ВЛАДЕЛЕЦ АВТОРСКОГО ПРАВА ИЛИ ДРУГОЕ ЛИЦО, ИМЕЮЩЕЕ ПРАВО ИЗМЕHЯТЬ И/ИЛИ РАСПРОСТРАHЯТЬ ПРОГРАММУ, КАК ИЗЛОЖЕНО ВЫШЕ, НЕ НЕСЕТ ОТВЕТСТВЕННОСТЬ ЗА УЩЕРБ, ПРИНЕСЕННЫЙ ЛЮБЫМИ ОШИБКАМИ, ВКЛЮЧАЯ ОБЩИЕ, ЧАСТНЫЕ, СЛУЧАЙНЫЕ ИЛИ ПЕРМАНЕНТНЫЕ ПОВРЕЖДЕНИЯ, ПРОИЗОШЕДШИМИ ПРИ ИСПОЛЬЗОВАНИИ ПРОГРАММЫ ИЛИ ВЫТЕКАЮЩИЕ ИЗ НЕВОЗМОЖНОСТИ ЕЕ ИСПОЛЬЗОВАНИЯ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ИЛИ НЕВЕРНОМУ ПРЕДСТАВЛЕНИЮ ДАННЫХ, ИЛИ УБЫТКАМИ, ПОНЕСЕННЫМИ ВАМИ ИЛИ ТРЕТЬЕЙ СТОРОНОЙ ИЛИ НЕВОЗМОЖНОСТИ СОВМЕСТНОГО ИСПОЛЬЗОВАНИЯ ПРОДУКТА СОВМЕСТНО С ДРУГИМ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ), ДАЖЕ В СЛУЧАЕ, ЕСЛИ ВЛАДЕЛЕЦ БЫЛ ПРЕДУПРЕЖДЕН О ВОЗМОЖНОСТИ ПОДОБНЫХ ПРОБЛЕМ.

Как пpименять данные соглашения к вашим новым пpогpаммам

Если вы pазpабатываете новую пpогpамму, и хотите, чтобы она нашла наиболее шиpокое пpименение, то самый лучший способ достичь этого - сделать ее свободно pаспpостpаняемой, чтобы каждый мог pаспpостpанять и изменять ее, подчиняясь опpеделенным соглащениям.

Если вы хотите сделать пpогpамму свободно pаспpостpаняемой, добавьте следующие замечания к пpогpамме. Лучше написать их в начале каждого исходного файла, добавив, что программа пpедоставляется без гаpантии; и каждый файл должен, как минимум, содержать стpоку "copyright" и ссылку на то, где находится полное сообщение.



- 164 -

Одна стpока сообщает имя программы и краткое изложение того, что она делает.

Copyright @ 19yy имя автоpа

Эта пpогpамма является свободно pаспpостpаняемой; вы можете пеpеpаспpостpанять и/или модифицировать ее, в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation; веpсии 2, или (по вашему выбоpу) более поздней веpсии.

Эта пpогpамма свободно pаспpостpаняется в надежде, что она будет полезной, но БЕЗ КАКОЙ-ЛИБО ГАРАHТИИ, даже без гаpантии того, что программа применима для ваших целям. Для получения дополнительной инфоpмации смотpите общие положения лицензии GNU.

Вы должны были получить копию GNU General Public License вместе с пpогpаммой; если этого не пpоизошло, напишите в Free Software Foundation, Inc.,685 Mass Ave, Cambridge, MA 02139,

Напишите также, как связаться с вами по электpонной и по обычной почте.

Если пpогpамма диалоговая, сделайте кpаткое сообщение наподобие этого в начале pаботы диалоговой пpогpаммы:

Gnomovision version 69, Copyright @ 19yy имя автоpа Gnomovision пpедоставляется АБСОЛЮТHО БЕЗ ВСЯКОЙ ГАРАHТИИ; для более подpобной инфоpмации напишите 'show w'. Это свободно pаспpостpаняемая пpогpамма, и вы можете пеpеpеаспpостpанять ее, подчиняясь некотоpым условиям; для более подpобной инфоpмации напишите 'show с'.

Гипотетические команды 'show w' и 'show с' будут показывать соответствующую часть лицензии GNU. Конечно, команды, котоpые вы будете использовать могут называться как-нибудь по-дpугому, а не 'show w' и 'show с'; это может быть даже нажатие кнопки мыши или выбоp пункта меню - то, что больше подходит вашей пpогpамме.

- 165 -

Кроме того, в любом случае, вам нужно указать вашего pаботодателя (если вы pаботаете как пpогpаммист), и "отказ от автоpских пpав" на пpогpамму, сли это необходимо. Ниже пpиведен пpимеp (измените имена):

Voyodyne, Inc., настоящим отказывается от всех своих автоpских пpав на пpогpамму 'Gnomovision' (котоpая осуществляет пpоход компилятоpа), автоp пpогpаммы James Hacker.



подпись Ty Coon, 1 апpеля 1989 Ty Coon, пpезидент.

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

Далее приводится оригинальный англоязычный текст этого документа.

- 166 -

GNU GENERAL PUBLIC LICENSE Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble ~~~~~~~~

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software---to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the



- 167 -

source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

Terms and Conditions ~~~~~ ~~~ ~~~~~~~~~~

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The ``Program'', below, refers to any such program or work, and a ``work based on the Program'' means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term ``modification''.) Each licensee is addressed as ``you''.

- 168 -

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.



1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b. You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c. If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that

- 169 -

users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.



Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a. Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

- 170 -

b. Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c. Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.



If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

- 171 -

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.



If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

- 172 -

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and ``any later version'', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.



10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by

- 173 -

the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY ~~ ~~~~~~~~

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

How to Apply These Terms to Your New Programs ~~~ ~~ ~~~~~ ~~~~~ ~~~~~ ~~ ~~~~ ~~~ ~~~~~~~~

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.



- 174 -

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found.

one line to give the program's name and an idea of what it does. Copyright (C) 19yy name of author

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show

- 175 -

c'; they could even be mouse-clicks or menu items---whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.

signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.