Как правильно использовать компьютер - Предварительные сведения

Программирование: введение в профессию. 1: Азы программирования - 2016 год

Как правильно использовать компьютер - Предварительные сведения

1.4.1. Операционные системы и виды пользовательского интерфейса

Установивший Windows сначала месяц радуется, потом всю жизнь мучается.

Установивший Unix сначала месяц мучается, потом всю жизнь радуется.

Из подслушанного у студентов

В предыдущем параграфе мы упоминали особую программу, которая называется операционной системой. В её основные задачи входит, во-первых, управление запуском и завершением других программ; во-вторых, операционная система берёт на себя управление периферийными устройствами во всём их многообразии, а всем остальным программам предоставляет упрощённые возможности для доступа к периферии: так, пользовательская программа может обратиться к операционной системе с просьбой открыть какой-нибудь файл на чтение (указав при этом только имя файла), прочитать из него информацию, разместить эту информацию в указанной области оперативной памяти, после чего закрыть файл, то есть прекратить работу с ним. Программу при этом совершенно “не волнует”, на диске какого типа располагается файл: на жестком диске, встроенном в компьютер (которых, кстати, тоже очень много и очень разных), на оптическом CDили DVD, на старотипной дискете, на flash-брелке или вообще на диске другого компьютера, который подключён в качестве сетевого ресурса. Все заботы о том, какие конкретно технические операции следует выполнить, чтобы найти файл с нужным именем и извлечь из него информацию, операционная система берёт на себя.

Первые операционные системы появились ещё в 1960-х годах, и за прошедшие с тех пор полвека, разумеется, их было создано очень много; но, как ни странно, к нынешнему времени количество принципиально разных операционных систем изрядно сократилось. Всем известно слово “Windows”; так называет свои системы компания Microsoft. При этом фактически все существующие ныне операционные системы, не имеющие отношения к Microsoft (и, соответственно, слова “Windows” в названии), оказываются представителями семейства систем под общим названием Unix. Именно таковы свободно распространяемые системы Linux во всём многообразии его дистрибуций, таких как Debian, Ubuntu, Fedora, Slackware, Gentoo и многие другие, и FreeBSD, вариаций которой гораздо меньше, но тоже есть. Кроме того, к семейству Unix относятся Android, который основан на ядре Linux, а также Mac OS X и iOS, которые, как и FreeBSD, ведут своё начало от версии Unix, созданной в университете Беркли (как мы помним, аббревиатура BSD означает Berkeley Software Distribution).

Роль, задачи и принципы работы операционных систем — это тема для долгого обсуждения, которому мы посвятим в этой книге отдельную часть — пятую; пока отметим, что в задачи операционных систем, вопреки распространённому заблуждению, никоим образом не входит организация взаимодействия с пользователем, т. е. человеком, который работает с компьютером. Дело тут в том, что операционные системы сами по себе достаточно сложны — по большому счёту, это едва ли не самые сложные программы из существующих в мире; поэтому их создатели обычно стараются всё, что может быть сделано вне операционной системы, именно вне её и делать. При этом средства общения компьютера с пользователем — так называемый пользовательский интерфейс — не обязан быть частью операционной системы, его может поддерживать обычная программа. Именно так делается во всех вариантах Unix; за рисование окошек, переключение между ними и всё такое прочее отвечают разнообразные надстройки, написанные в виде обычных программ, запускающихся под управлением операционной системы, но при этом не являющихся её частью. В операционных системах Microsoft, напротив, поддержка графического интерфейса включена в ядро системы, что приводит, в частности, к невозможности для пользователя самостоятельно выбрать интерфейс; работать приходится с тем единственным интерфейсом, который предоставлен системой.

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

Большинство конечных пользователей16 компьютеров в наши дни не понимает, как вообще можно использовать компьютер, если на нём нет графического интерфейса, но это, по большому счёту, лишь следствие проводимой некоторыми корпорациями пропаганды. Вплоть до середины 1990-х годов графические пользовательские интерфейсы не имели такого всеобъемлющего распространения, как сейчас, что совершенно не мешало людям пользоваться компьютерами, да и сейчас многие пользователи предпочитают копировать файлы и просматривать содержимое дисков с помощью двухпанельных файловых мониторов, таких как Far Manager или Total Commander, идеологическим предшественником которых был Norton Commander, работавший в текстовом режиме. Любопытно, что даже традиционный оконный интерфейс, в котором подразумевается возможность менять размеры окон, перемещать их по экрану, частично накладывать друг на друга и т. п., первоначально был реализован без всякой графики, на экране алфавитно-цифрового монитора.

Впрочем, и Norton Commander со всеми его поздними клонами, и оконные интерфейсы, использовавшие текстовый режим (а во времена MS-DOS они были весьма популярны), хотя и не используют графику как таковую, всё же основаны на том же базовом принципе, что и привычные ныне “иконочно-менюшечные” интерфейсы: пространство экрана они используют для размещения так называемых элементов интерфейса, или “виджетов”, которые обычно включают меню, кнопки, флажки и переключатели (англ. checkboxes и radiobuttons), поля для ввода текстовой информации, а также статические поясняющие надписи; использование графического режима несколько расширяет репертуар виджетов, включая в него окна с пиктограммами (“иконками”), всевозможные ползунки, индикаторы и другие элементы, на которые хватило фантазии у разработчика. Между тем, понаблюдав за работой профессионалов — программистов и системных администраторов, в особенности тех из них, кто использует системы семейства Unix, можно заметить ещё один подход к взаимодействию человека с компьютером: командную строку. В этом режиме пользователь вводит с клавиатуры команды, предписывающие выполнение тех или иных действий, а компьютер эти команды исполняет и выводит на экран результаты; когда-то давно именно это называлось диалоговым режимом работы с компьютером, в отличие от пакетного режима, когда операторы заранее формировали пакеты заданий, полученных от программистов, а компьютер эти задания обрабатывал по мере готовности.

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

Рис. 1.4. Телетайп ASR-33 с перфоратором и устройством чтения перфолент18

Подключить телетайп к компьютеру догадались ещё в эпоху первого поколения ЭВМ; свою роль сыграло то обстоятельство, что телетайпы к тому времени серийно производились для нужд телеграфии и были доступны на рынке, то есть их не надо было разрабатывать, а компьютерным инженерам того времени хватало других забот. Работая с компьютером в диалоговом режиме с помощью телетайпа, оператор набирал команду на клавиатуре, а ответ компьютера печатался на бумажной ленте. Интересно, что такой режим работы “продержался” на удивление долго: он был полностью вытеснен из практики лишь к концу 1970-х годов.

Использование телетайпа в качестве устройства доступа к компьютеру имело очевидный недостаток: расходовалось очень много бумаги. Первоначально именно это стало причиной массового перехода от традиционных телетайпов к алфавитно-цифровым терминалам, которые были оснащены клавиатурой и устройством отображения (экраном) на основе электронно-лучевой трубки (кинескопа); всё, что оператор набирал на клавиатуре, передавалось в линию связи, а информация, полученная оттуда, отображалась на экране. Например, если два терминала соединить друг с другом, операторы смогут между собой “поговорить”.

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

Сейчас алфавитно-цифровые терминалы больше не выпускаются; при необходимости с этой ролью может справиться любой ноутбук, оснащённый последовательным портом или переходником USB-serial, если на нём запустить соответствующее программное обеспечение; кстати, первоначальная настройка упоминавшихся выше серверных машин, не имеющих видеокарты, производится именно так: системный администратор подключает свой рабочий компьютер через COM-порт к настраиваемой серверной машине к запускает у себя эмулятор терминала. Это позволяет произвести загрузку операционной системы с внешнего носителя, установить её на серверную машину, настроить связь с локальной сетью и средства удалённого доступа; дальнейшая настройка, а также управление в ходе эксплуатации обычно производятся удалённо по сети, поскольку это удобнее — настраиваемый компьютер уже не нужно связывать шнуром напрямую с машиной администратора.

Иногда можно услышать, что системы семейства Unix якобы неудобны для пользователя, потому что там приходится работать с командной строкой. Это, разумеется, миф, истоками которого служат перепутанные причины и следствия. Опровергнуть этот миф проще простого: вряд ли кто-нибудь, кто хотя бы раз видел ноутбук от Apple, заявит, что в MacOS X отсутствует графический интерфейс пользователя; наоборот, он там едва ли не самый “развесистый”. Большинство “обычных” пользователей этим вполне удовлетворяется, но когда очередной макбук оказывается в руках профессионала, среди всего великолепия графического интерфейса внезапно обнаруживается эмулятор терминала с приглашением командной строки.

Практически то же самое происходит на современных дистрибуциях свободно распространяемых Unix-систем, ориентированных на конечного пользователя. Бросается в глаза разнообразие графических оболочек, используемых там. Как уже говорилось, графический интерфейс пользователя здесь не является частью операционной системы; больше того, в отличие от коммерческих систем, включающих ту же MacOS X, внешний вид пользовательского интерфейса в традиционных системах не зашит намертво в графическую надстройку, а реализуется отдельной программой, которая называется оконным менеджером. Пользователь может выбрать тот внешний вид и функциональность оконной системы, которые ему удобнее, а при определённой сноровке — менять вид и поведение оконной системы, например, в зависимости от настроения, причём прямо во время работы, даже не закрывая окна запущенных приложений.

Разумеется, для Linux и FreeBSD давно существуют, кроме прочего, и “иконочные” файловые менеджеры, причём их написано довольно много — Nautilus, Dolphin, Konqueror, PCManFM, Thunar, Nemo, SpaceFM, ROX Desktop, Xfe и другие; ещё шире представлены двухпанельные файловые менеджеры, продолжающие традиции знаменитого Norton Commander: это текстовый MidnightCommander, а также графические gentoo (его не следует путать с одноимённым дистрибутивом Linux), Krusader, emelFM2, Sunflower, GNOME Commander, Double Commander, muCommander и т. п. Тем не менее многие профессионалы предпочитают работать с файлами — копировать их, переименовывать, сортировать по отдельным каталогам* 19, перебрасывать с диска на диск, удалять — с помощью команд командной строки. Это объясняется одним очень простым фактом: так действительно удобнее и быстрее.

Рис. 1.5. Терминал vt10020

Интересно, что средства командной строки присутствуют и в системах семейства Windows; получить окно терминала с соответствующим приглашением там можно, если нажать пресловутую кнопку “Пуск” (Start), выбрать в меню пункт “Выполнить” (Run) и в качестве имени команды ввести три буквы “cmd”; но стандартный интерпретатор командной строки под Windows очень примитивен, использовать его неудобно, а большинство пользователей даже не подозревают о его существовании. Профессионалам он тоже не подходит, так что в мире Windows даже они вынуждены обходиться графическими интерфейсами, задействуя командную строку только в редких случаях, как правило, связанных с обслуживанием системы. Программисты, привыкшие к Unix-системам и по тем или иным причинам вынужденные работать с Windows, часто устанавливают там перенесённые из-под Unix интерпретаторы командной строки; например, такой интерпретатор входит в пакет MinGW.

Конечно, командная строка требует некоторого запоминания, но команд, которые необходимо запомнить, не так много; между тем графические интерфейсы, несмотря на все заявления об их “интуитивной понятности”, тоже вынуждают много чего запомнить: чего стоит одно только использование клавиш Ctrl и Shift в сочетании с “мышкой” при выделении элементов (это ещё довольно просто, поскольку результат сразу же виден) и при копировании файлов, их перемещении и создании “ярлыков”. Обучение работе с графическими интерфейсами “с нуля”, то есть когда обучаемый вообще не имеет никакого опыта работы с компьютером, оказывается на поверку тяжелее, чем обучение работе со средствами командной строки; широкая публика потихоньку перестаёт замечать это просто потому, что сейчас к графическим интерфейсам люди начинают привыкать с дошкольного возраста в силу их широкого распространения — которое, в свою очередь, является скорее результатом усилий PR-подразделений определённых коммерческих корпораций, нежели следствием весьма сомнительного “удобства” графических интерфейсов. Зачастую пользователь привыкает не к графическому интерфейсу в принципе, а к конкретной версии такового и оказывается совершенно беспомощен, например, при переходе на другую версию операционной системы.

Конечно, прежде чем средства работы с командной строкой стали действительно удобными, им пришлось пройти долгий путь совершенствования. Современные интерпретаторы командной строки “помнят” несколько сотен последних введённых пользователем команд и позволяют быстро и без усилий найти нужную команду среди запомненных; кроме того, они позволяют редактировать вводимую команду с помощью клавиш “стрелок”, “угадывать” имя файла по первым введённым буквам, некоторые варианты интерфейса командной строки выдают пользователю контекстные подсказки относительно того, что ещё можно написать в этой части вводимой команды, и т. п. Работа с такой командной строкой при условии хорошего уровня владения ею может происходить в разы и даже в десятки раз быстрее, чем выполнение тех же действий с помощью сколь угодно “навороченного” графического интерфейса. Представьте себе, к примеру, что вы вернулись из поездки в Париж и хотите скопировать на свой компьютер фотографии с карточки фотоаппарата. Команды

с учётом автодополнения имён файлов и использования истории команд можно, не особенно торопясь, набрать за шесть-семь секунд, ведь большую часть текста вообще не придётся набирать: скорее всего, у вас в домашнем каталоге только имя подкаталога Photoalbum начинается с Ph, так что достаточно будет набрать только эти две буквы, нажать клавишу Tab, и командный интерпретатор допишет имя Photoalbum, услужливо поставив после него косую черту; то же самое можно сделать при наборе команды “mount /mnt/flash” (каталог mnt — скорее всего, единственный в корневом каталоге начинается с m, а его подкаталог flash — скорее всего, единственный, который начинается с f); вместо “ср /mnt/flash/dcim/* .” опытный пользователь наберёт “ср !:1/dcim/* .”, а интерпретатор вместо “!:1” подставит первый аргумент предыдущей команды, то есть “/mnt/flash”; команду “umount /mnt/flash” набирать не нужно, достаточно будет набрать “u!m” (вместо !m будет подставлен текст последней команды, начинавшейся с m), или просто нажать два раза стрелку вверх и в появившейся на экране команде mount/mnt/flash добавить в начало букву u.

Если те же действия выполнять через интерфейс с пиктограммами, то вам понадобится сначала щелчками “мышки” добраться до содержимого карточки, затем, используя “мышку” в сочетании с клавишей Shift, пометить весь список файлов, правой кнопкой “мышки” вызвать контекстное меню, выбрать в нём действие “копировать”, затем найти (всё теми же щелчками “мышки”) каталог Photoalbum/2014, снова вызвать контекстное меню, создать подкаталог Paris, двойным щелчком зайти в него и, наконец, вызвав контекстное меню в третий раз, выбрать в нём пункт “вставить”. Даже если всё делать быстро, у вас на эту процедуру уйдёт никак не меньше двадцати-тридцати секунд, а то и больше. Но это, как ни странно, не главное. Если вы, к примеру, очень часто копируете фотографии к себе на диск, то с использованием командной строки эту процедуру можно автоматизировать, написав так называемый скрипт — обычный текстовый файл, состоящий из команд. Для нашего примера скрипт может выглядеть так:

но опытный пользователь, скорее всего, напишет скрипт более гибко:

Если теперь назвать любой из этих двух скриптов, например, getphotos, то в следующий раз, когда потребуется скопировать новые фотографии (например, по возвращении из Милана), достаточно будет дать команду

С графическими интерфейсами такой фокус не проходит: в отличие от команд, движения и щелчки “мышки” не поддаются формальному описанию, во всяком случае, достаточно простому для практического использования.

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

Само имя запускаемой программы (в данном случае firefox) не настолько длинное, чтобы с его набором могли быть какие-то проблемы, особенно с учётом автодополнения — например, автору на его компьютере оказалось достаточно набрать только буквы fir и нажать Tab; ну а адрес сайта вам всё равно пришлось бы набрать на клавиатуре, только, возможно, не в командной строке, а в соответствующем окошке браузера.

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

Эти возможности, во всяком случае, заведомо стоят того, чтобы их изучить. Конечно, преодолеть влияние пропаганды “софтверных” монстров и убедить всех пользователей компьютеров перейти на командную строку — задача в современных условиях нереальная; но, коль скоро вы читаете эту книгу, по-видимому, вы не совсем обычный пользователь. Так вот, для профессионала в сфере информационных технологий свободное владение средствами командной строки практически обязательно; отсутствие этих навыков резко снижает вашу ценность как специалиста. Наконец, очень важно и то, что интерфейс командной строки оказывается чрезвычайно полезен в ходе начального обучения программированию, если угодно, в качестве учебного пособия. Причины этого подробно изложены в “методическом предисловии”, но оно может оказаться непонятным для неспециалиста; в таком случае автору остаётся только просить читателя на некоторое время принять важность командной строки на веру; это ненадолго, вскоре вам всё станет понятно.

Вся наша книга написана в предположении, что на вашем компьютере установлена та или иная система семейства Unix и что вы используете для работы с компьютером интерфейс командной строки; тому, как это делается, посвящён остаток этой главы. Хотя мы уже говорили об этом в предисловии, но сочтём уместным повторить: если вы хотите чему-то научиться с помощью этой книги, интерфейс командной строки должен стать для вас основным способом повседневной работы с компьютером, причём это должно произойти как можно раньше.

1.4.2. Unix на домашней машине

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

Основных вариантов21 выбора системы, собственно, всего два: это Linux и FreeBSD, причём из доступных вариантов FreeBSD конечному пользователю с некоторой натяжкой подходит разве что PC-BSD. С вариантами Linux проблема, можно сказать, противоположна: их так много, что оказывается затруднительно сделать выбор. В любом случае, мы возьмём на себя смелость в качестве первой системы порекомендовать именно Linux; при желании вы можете позже, когда уже будете представлять, что делаете, попробовать поставить FreeBSD.

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

Самый простой способ решения проблемы — установить Unix на отдельный компьютер; этот способ подойдёт вам, если у вас найдётся “устаревший” компьютер, который вы перестали использовать после покупки более новой модели, но продать не успели или по каким-то причинам не захотели. Вас может удивить, насколько нетребовательны Unix-системы к характеристикам аппаратуры: компьютер, которому исполнилось уже лет десять и который вы считали ни на что не годным, под управлением того же Linux будет просто “летать”. Профессионалы легко устанавливают Linux на машины класса Pentium-1 производства середины 1990-х годов, хотя так делать, пожалуй, мы вам не посоветуем: многие современные программы на такое не рассчитаны, так что приходится пользоваться их старыми, неподдерживаемыми версиями. Впрочем, вряд ли у вас найдётся исправный Pentium-1; ну а всё, что новее, вам вполне подойдёт. Между прочим, даже если нужного компьютера у вас в запасах не оказалось, вы можете попробовать приобрести такую машинку с рук на какой-нибудь барахолке в Интернете; как правило, денег за них хотят совсем немного, килограмм колбасы может стоить дороже.

Если отдельного компьютера нет, остаётся вариант с установкой Linux на один из дисков имеющейся машины. В принципе, Linux может быть установлен на любой логический диск, но займёт этот диск, безусловно, целиком, поскольку формат файловой системы у Linux совершенно не такой, как у Windows. Если жёсткий диск вашего компьютера разбит на логические разделы (“С:”, “D:” и так далее), вы можете выбрать любой из них, сделать копии всех нужных файлов, удалить этот логический диск (проще сделать это средствами Windows, хотя можно и в процессе установки Linux), а затем поставить Linux на освободившееся пространство. Если у вас есть программное обеспечение, способное изменять размеры существующих логических дисков, то проще будет сократить ваш логический диск в размерах, чтобы на жёстком диске образовалось незанятое пространство. Примерно 10-15 Gb будет более чем достаточно.

С самого начала лучше ориентироваться на “облегчённые” оконные менеджеры, такие как IceWM, Xfce, LXDE и другие. Автор этих строк на всех своих компьютерах использует древний и довольно аскетичный fvwm2, с которого начал при переходе на Linux в 1994 году; но рекомендовать его читателю, пожалуй, всё же не станет. Чего следует по возможности избегать — так это использования “тяжёлых” окружений, прежде всего KDE и GNOME; в конце концов, операционная среда нужна, чтобы в ней запускать программы, а создатели “тяжёлых” оконников об этом, похоже, забывают: их изделия сами благополучно съедают львиную долю ресурсов системы.

Независимо от того, сами вы устанавливаете себе систему или вам в этом кто-то помогает, необходимо сразу же найти, как запускать эмулятор терминала; это может быть одна из программ xterm, konsole, Terminal и других. Обычно окно эмулятора терминала по умолчанию имеет такой размер, чтобы в нём помещалось 24 строки по 80 символов; изменять количество символов не следует, оно практически оптимально, но вот размер одного символа (и, как следствие, размер всего терминального окошка) практически всегда стоит подрегулировать так, чтобы окно, по-прежнему вмещая 24x80 символов, при этом накрыло большую часть вашего экрана. Рекомендуется сразу же настроить чёрный цвет фона и серые (не белые, а именно серые) буквы; так глаза меньше устают.

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

Обязательно установите себе программы для повседневного использования — браузер (он, впрочем, скорее всего установится в процессе инсталляции системы), LibreOffice для работы с файлами “офисных” форматов, evince для чтения PDF-файлов, eog для просмотра изображений, mplayer для воспроизведения аудио и видео. Подумайте, что ещё вы обычно делаете на своём компьютере под управлением Windows и узнайте, как то же самое делается в Linux; можете не сомневаться, всё это возможно.

Наконец, в процессе изучения материала, приведённого в этой книге, вам также потребуются программистские редакторы текстов (попробуйте сразу же установить vim, joe и nano, чтобы они всегда были “под рукой”), компилятор Free Pascal (соответствующий пакет может называться fpc или fp-compiler; интегрированную среду устанавливать не надо), ассемблер NASM (пакет обычно так и называется “nasm”), компилятор Си и Си++, который называется gcc (убедитесь, что при этом часть, имеющая отношение к Си++, тоже установилась, иногда они бывают в разных пакетах; впрочем, до Си++ дело дойдёт ещё не скоро), система сборки make, отладчик gdb. После установки всего этого вы готовы к дальнейшей работе.

С самого начала обязательно создайте для обычной работы непривилегированную пользовательскую учётную запись и всю работу проводите под ней. Повседневная работа с правами пользователя root (то есть системного администратора) категорически недопустима, причём некоторые программы даже откажутся запускаться. Входить в систему с правами администратора нужно только в случае необходимости (например, чтобы установить в системе дополнительные программы, скорректировать системные настройки и т. п.), причём лучше это делать с текстовой консоли, а не из графической оболочки; для переключения на текстовую консоль нажмите Ctrl-Alt-Fl, для переключения обратно в оболочку X Window — Alt-F7, Alt-F8 или Alt-F9, в зависимости от конфигурации вашей системы. Отметим, что использовать команду sudo для повышения своих полномочий с пользовательских до администраторских тоже крайне нежелательно, несмотря на то, что в разнообразных руководствах (особенно ориентированных на дистрибутив Ubuntu) ровно так и предлагается делать. Опытные пользователи Unix вообще не допускают наличия этой команды в системе.

1.4.3. Первый сеанс в компьютерном классе

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

Если речь идёт о компьютерном классе, то краткую инструкцию о том, как войти в систему, вы, скорее всего, получите от преподавателя или от системного администратора компьютерного класса вместе с вашим входным именем (login) и паролем (password). Итак, введите входное имя и пароль. Если вы сделали ошибку, система выдаст сообщение Login incorrect, которое может означать как опечатку во входном имени, так и неправильный пароль. Учтите, что регистр букв важен в обоих случаях, так что причиной неприятия системой пароля может быть, например, случайно нажатая клавиша CapsLock.

Для работы с системой вам необходимо получить приглашение командной строки. При использовании удаленного терминального доступа (например, с помощью программы putty) командная строка — это единственное средство работы с системой, которое вам доступно. Приглашение появится сразу после того, как вы введете верные имя и пароль. Если вы работаете в терминальном Unix-классе и вход в систему выполняете с помощью текстовой консоли, после ввода верных имени и пароля вы также немедленно получаете приглашение командной строки, однако в этом случае у вас есть возможность запустить один из возможных графических оконных интерфейсов. Это удобнее хотя бы тем, что можно открыть несколько окон одновременно. Для запуска графической оболочки X Window необходимо дать команду startx22; после этого нужно запустить один или несколько экземпляров программы xterm, выглядящей как графическое окно, в котором запускается интерпретатор команд.

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

Первым вашим действием в системе, если только это не ваш личный компьютер, должна стать смена пароля. В зависимости от конфигурации системы это может потребовать команды passwdили (в редких случаях) какой-то другой; об этом вам, скорее всего, скажет системный администратор. Введите эту команду (без параметров). Система спросит у вас сначала старый пароль, затем (дважды) новый. Учтите, что при вводе пароля на экране ничего не отображается. Придуманный вами пароль должен содержать не менее восьми символов, причём в нём должны присутствовать латинские буквы верхнего и нижнего регистров, цифры и знаки препинания. Пароль не должен основываться на слове естественного языка или на вашем входном имени. Вместе с тем следует придумать такой пароль, который вы легко запомните. Проще всего взять какую-либо запоминающуюся фразу, содержащую знаки препинания и числительные, и построить пароль на ее основе (числительные передаются цифрами, от остальных слов берутся первые буквы, причём буквы, соответствующие существительным, берутся заглавными, остальные — строчными). Например, из пословицы “Один с сошкой, семеро с ложкой” можно “сделать” пароль 1sS,7sL.. И последнее: не сообщайте свой пароль никому и никогда, а также никому и никогда не позволяйте работать в системе под вашим именем. Фразы вроде “мне не жалко”, “я доверяю своим друзьям” или “у меня там всё равно нет ничего секретного” суть проявление дилетантства и легкомыслия в самом худшем смысле слова, и по мере набора опыта вы сами это поймёте.

1.4.4. Дерево каталогов. Работа с файлами

Система каталогов в ОС Unix существенно отличается от привычной пользователям MS-DOS и Windows, и наиболее заметные на первый взгляд отличия — это отсутствие букв, обозначающих устройства (что- то вроде А:, С: и т. п.), а также то обстоятельство, что имена каталогов разделяются в ОС Unix не обратной, а прямой косой чертой (/).

После входа в систему вы окажетесь в вашем домашнем каталоге. Домашний каталог — это место для хранения ваших личных файлов. Чтобы узнать имя (путь) текущего каталога, введите команду pwd23:

Узнать, какие файлы находятся в текущем каталоге, можно с помощью команды ls:

Имена файлов в ОС Unix могут содержать любое количество точек в любых позициях, т. е., например, a.b..c...d....e является вполне допустимым именем файла. При этом действует соглашение, что имена, начинающиеся с точки, соответствуют “невидимым” файлам. Чтобы увидеть все файлы, включая невидимые, можно воспользоваться командой ls -a:

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

Таблица 1.1. Команды для работы с файлами

ср

mv

rm

mkdir

rmdir

touch

less

копирование файла

переименование или перемещение файла

удаление файла

создание директории

удаление директории

создание файла или установка нового времени модификации

просмотр содержимого файла с пейджингом

Теперь мы видим, что все имена, кроме .bash_history, соответствуют каталогам. Заметим, что “.” — это ссылка на сам текущий каталог, а “..” — ссылка на каталог, содержащий текущий каталог (в нашем примере это /home/lizzie).

Перейти в другой каталог можно командой cd:

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

Основные команды работы с файлами перечислены в табл. 1.1. Например, команда ср file1.txt file2.txt создаст копию файла file1.txt под именем file2.txt; команда rm oldfile удалит файл с именем oldfile. Большинство команд принимает дополнительные флажки-опции, начинающиеся со знака ‘-’. Так, команда rm -r the_dir позволяет удалить каталог the_dir вместе со всем его содержимым.

1.4.5. Шаблоны имён файлов

Во многих случаях бывает удобно произвести ту или иную операцию сразу над несколькими файлами. Для этого командный интерпретатор поддерживает подстановку имён файлов по заданному шаблону. В качестве шаблона интерпретатор рассматривает любое слово, не заключённое в кавычки или апострофы, содержащее хотя бы один символ “*” или “?”, квадратные или фигурные скобки. Знак вопроса в шаблоне считается соответствующим одному произвольному символу, а знак звёздочки — произвольной цепочке символов (в том числе, возможно, пустой); смысл скобок мы поясним чуть позже. Остальные символы в шаблоне обозначают сами себя. Встретив в командной строке такой шаблон, интерпретатор заменяет его списком из всех имён файлов, соответствующих шаблону, то есть в общем случае слово-шаблон может быть заменено на последовательность слов, имеющую произвольную длину: одно слово, десять, сто, тысяча, сколько угодно — в зависимости от того, сколько файлов соответствуют шаблону. Например, вместо шаблона, состоящего из одной звёздочки (или из произвольного количества звёздочек), интерпретатор подставит список всех файлов из текущей директории; вместо шаблона “???*” будут подставлены все имена файлов, состоящие не менее чем из трёх символов, а вместо “???” — имена файлов, состоящие ровно из трёх символов. Шаблон “*.txt” заменится на список всех имён файлов, имеющих суффикс24.txt, а шаблону img_????.jpg будут соответствовать имена вроде img_2578.jpg, img_cool.jpg и прочее в таком духе.

Применять шаблоны можно в любых командах, предполагающих списки имён файлов в качестве аргументов. Например, команда rm*˜ удалит в текущей директории все файлы, в имени которых последним символом стоит тильда, команда “ls /etc/*conf.” покажет список файлов с суффиксом .conf, находящихся в директории /etc, команда “cp files/* /mnt/flash” скопирует в директорию /mnt/flash все файлы из поддиректории files, находящейся в текущей директории, и так далее. В принципе команда, которую мы заставляем работать с шаблонами, не обязана предполагать именно файлы; так, команда “echo *” напечатает список файлов в текущей директории; между тем, команда echo сама по себе не имеет никакого отношения к файлам и не работает с файлами: она печатает свои аргументы командной строки.

Квадратные скобки в шаблоне позволяют обозначить любой символ из заданного множества; например, шаблон “img_27[234][0123456789].jpg” соответствует именам img_2720.jpg, img_2721.jpg, ..., img_2734.jpg, ..., img_2749.jpg и более никаким. Конечно, в реальной жизни можно воспользоваться тем обстоятельством, что, скорее всего, в директории нет ни одного файла, у которого в имени вместо четвёртой цифры стояло бы что-то другое, и воспользоваться более коротким шаблоном “img_27[234]?.jpg”. Символ восклицательного знака позволяет, напротив, обозначить любой символ кроме перечисленных; например, “[!_]*.с” соответствует любым именам файлов, имеющим суффикс “.с”, за исключением начинающихся с символа подчёркивания.

Фигурные скобки в шаблонах обозначают любую цепочку символов из явно перечисленных, сами цепочки при этом разделяются запятой. Например, шаблон “*.{jpg,png,gif}” соответствует всем файлам из текущей директории, имеющим суффиксы .jpg, .png или .gif.

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

1.4.6. История команд и автодописывание имён файлов

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

Для начала отметим, что современные командные интерпретаторы умеют дописывать имена файлов; эта возможность задействуется нажатием клавиши Tab. Начав писать имя файла, вы можете нажать Tab, и если на диске есть только один файл, имя которого начинается с букв, уже введённых вами, то его имя интерпретатор допишет за вас. Если же подходящих файлов больше одного, при нажатии на клавишу Tab ничего видимого не произойдёт, но вы можете тут же нажать на неё второй раз, и интерпретатор выдаст вам полный список файлов, подходящих к вашему случаю; бросив взгляд на этот список, вы в большинстве случаев поймёте, сколько букв вам ещё нужно набрать, прежде чем снова нажать Tab. Некоторые интерпретаторы умеют дописывать не только имена файлов, но и другие параметры в зависимости от команды, которую вы собрались дать. В целом эта возможность, называемая автодополнением (англ. autocompletion), способна сэкономить вам больше половины нажатий на клавиши.

Вторая удачная возможность интерпретатора, изрядно облегчающая жизнь пользователю, состоит в том, что интерпретатор помнит историю введённых вами команд, причём при завершении сеанса работы он эту историю сохраняет в специальном файле, так что вы можете воспользоваться своими командами и на следующий день, и через неделю. Если нужная команда была дана недавно, вы можете вернуть её на экран, последовательно нажимая клавишу “стрелка вверх”; случайно проскочив нужную команду при таком “движении вверх”, можно вернуться обратно, нажав, что вполне естественно, “стрелку вниз”. Любую команду из сохранённой истории вы можете отредактировать, используя привычные “стрелки” влево и вправо, клавиши Home, End и Backspace в их обычной роли.

Всю сохранённую историю можно просмотреть, используя команду history, в большинстве случаев её удобнее будет сочетать с пейджером less, то есть дать команду history │ less. Здесь вы увидите, что каждая из запомненных интерпретатором команд снабжена номером; вы можете повторить любую из старых команд, зная её номер, используя восклицательный знак; например, !137 выполнит команду, сохранённую в истории под номером 137. Отметим, что “!!” обозначает последнюю введённую команду, а “!:0”, “!:1” и т.д. — отдельные слова из неё; “!аbс” обозначает последнюю команду, начинавшуюся со строки abc.

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

Если при редактировании команды, поиске в истории и т. п. вы запутались, можно в любой момент сбросить вводимую строку, нажав Ctrl-C; это гораздо быстрее, чем, например, удалять все введённые символы, настойчиво нажимая на Backspace.

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

1.4.7. Управление выполнением задач

Далеко не все команды исполняются мгновенно, как это делали в наших примерах pwd, cd и ls; часто требуется сообщить запущенной программе, что пора заканчивать работу, а если она не понимает по- хорошему — прекратить её выполнение принудительно.

Первое, что нужно помнить при работе в командной строке Unix — это что многие программы подразумевают чтение данных с клавиатуры (говоря строже, “из потока стандартного ввода”) до тех пор, пока там не возникнет ситуация конца файла. С этим моментом у начинающих часто возникают определённые сложности: как может кончиться файл, более-менее понятно, но как то же самое может произойти с клавиатурой ?! Но на самом деле ничего сложного тут нет. В ОС Unix используется обобщённый термин “поток данных”, который может означать как чтение из файла, так и ввод данных с клавиатуры, или ещё откуда-нибудь; подробный разговор об этом у нас впереди. Одним из фундаментальных свойств потока данных является его способность заканчиваться.

Естественно, клавиатура сама по себе “кончиться” не может, но пользователь, вводящий данные, имеет полное право решить, что он уже ввёл всё, что хотел. Чтобы сообщить об этом активной программе (то есть той программе, которая в данный момент читает информацию, вводимую с клавиатуры), нужно нажать комбинацию клавиш Ctrl-D; при этом операционная система (если быть точным, драйвер терминала) устроит в соответствующем потоке ввода ситуацию “конец файла”, и хотя наша клавиатура вроде бы никуда не делась, активная программа будет точно знать, что её входной поток информации иссяк. Между прочим, командный интерпретатор, который ведёт с нами диалог, тоже корректно обрабатывает ситуацию конца файла, так что если вы хотите завершить сеанс работы в одном из окон с командной строкой, наиболее корректный способ сделать это — нажать Ctrl-D; отметим заодно, что закрывать окно терминала средствами оконного менеджера (всякими дабл-кликами или через менюшки) — напротив, способ самый некорректный, поступать так с терминалами ни в коем случае не следует.

Умение имитировать на клавиатуре ситуацию “конец файла” ещё не раз потребуется нам в дальнейшем, так что запомните: “конец файла” на клавиатуре имитируется нажатием Ctrl-D.

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

Простейший и наиболее общепринятый способ принудительного завершения активной программы — это нажатие комбинации Ctrl-C; в большинстве случаев это поможет. К сожалению, бывает и так, что от Ctrl-C не наблюдается никакого эффекта; в этом случае можно попробовать нажать Ctrl-\, в некоторых случаях активную программу это всё-таки остановит, но после этого (в зависимости от настроек системы) в текущем каталоге может появиться файл с именем core (в системе FreeBSD — файл с суффиксом .core), который стоит удалить сразу же, как только вы его увидели — он занимает довольно много места и при этом для вас пока совершенно бесполезен.

Чего точно не следует делать — это использовать комбинацию Ctrl-Z до тех пор, пока вы не поймёте, что она в действительности делает в ОС Unix. Этот вопрос мы подробно обсудим чуть позже.

Прежде чем переходить к использованию “тяжёлой артиллерии”, следует ещё вспомнить, что терминалы обычно позволяют временно останавливать вывод (чтобы, например, успеть прочитать нужный фрагмент текста к не дать ему “прокрутиться” за пределы экрана). Такая “пауза” включается комбинацией Ctrl-S, а выключается — нажатием Ctrl-Q. Начинающие операторы Unix, привыкшие к комбинациях клавиш в графических интерфейсах, часто нажимают Ctrl-S случайно (пытаясь, например, сохранить файл в редакторе текстов и забыв, что здесь не Windows). Если вам кажется, что ваш терминал безнадёжно завис, на всякий случай попробуйте нажать Ctrl-Q: это поможет, если причиной “зависания” стала случайно нажатая “пауза”, а в остальных случаях ничего плохого всё равно не случится.

Начинающие пользователи Unix часто делают ещё одну характерную ошибку — не зная, как справиться с программой, запущенной в окне терминала, они попросту закрывают само окно, например, дважды щёлкнув мышкой “где следует”. Такая стратегия сродни засовыванию головы в песок: зависшей программы больше не видно, но это не значит, что она исчезла. Напротив, если не помогли штатные методы, то уж закрытие терминального окна не поможет тем более: запущенная задача продолжает работать, при этом она может впустую расходовать процессорное время, память, а в некоторых случаях и ещё что-нибудь натворить.

Если ни Ctrl-C, ни Ctrl-\, ни Ctrl-Q не помогли, то для принудительного завершения задачи придётся разобраться (хотя бы кратко) с понятием процесса и тем, как с процессами обращаться. В самом первом приближении “процесс” — это программа, которая запущена и в настоящий момент выполняется в системе; иначе говоря, когда вы запускаете любую программу, в системе появляется процесс, а когда программа заканчивает выполнение, соответствующий процесс исчезает (завершается). На самом деле всё несколько сложнее, например, запущенная вами программа может по своему усмотрению породить ещё несколько процессов и т. д.; всё это будет обсуждаться во втором томе нашей книги, в части, посвящённой операционным системам. Пока нас волнует вопрос сугубо прагматический: если мы запустили программу, в результате чего в системе возник процесс, то как этот процесс найти и уничтожить?

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

Как видно, команда по умолчанию выдаёт только список процессов, запущенных в данном конкретном сеансе работы. К сожалению, флаги команды ps очень сильно отличаются в зависимости от версии (в частности, для FreeBSD и Linux). За подробной информацией следует обращаться к документации по данной конкретной ОС; здесь мы ограничимся замечанием, что команда “psах” выдаст список всех существующих процессов, а команда “ps ахи” дополнительно покажет информацию о владельцах процессов25.

В некоторых случаях может оказаться полезной программа top, работающая интерактивно. Она выдаёт на экран список наиболее активных процессов, обновляя его один раз в секунду. Чтобы выйти из программы top, нужно ввести букву q.

Снять процесс можно с помощью так называемого сигнала; заметим, именно это происходит при нажатиии упоминавшихся выше комбинаций Ctrl-C и Ctrl-\, сигналы процессу при этом посылает драйвер терминала. Каждый сигнал имеет свой номер, название и некую предопределённую роль; больше про сигналы ничего толком сказать нельзя, понятие “отправки процессу сигнала” невозможно пояснить, не влезая в дебри, но нам это сейчас не требуется. Достаточно знать, во-первых, что процессу можно отправить сигнал с заданным номером (или именем); во-вторых, что процесс может сам решить, как реагировать на большинство сигналов, в том числе не реагировать на них вообще никак; и в-третьих, что существуют такие сигналы, над которыми процессы не властны; это позволяет убить процесс наверняка.

Комбинации Ctrl-C и Ctrl-\ отправляют активному процессу соответственно сигналы SIGINT и SIGQUIT (для наглядности отметим, что они имеют номера 2 и 3, но помнить это не нужно). Обычно оба этих сигнала приводят к немедленному завершению процесса; если этого не произошло — скорее всего, ваш процесс их “перехватил” и для его снятия придётся применить неперехватываемый сигнал SIGKILL (№9). Отправить процессу произвольный сигнал позволяет команда kill, но прежде чем её применять, нужно узнать номер процесса, который мы хотим уничтожить. Для этого обычно открывают ещё одно окно терминала и в нём дают команду ps ах; в появившемся списке будут показаны как номера процессов, так и их командные строки, что обычно позволяет узнать номер нужного нам процесса. Например, если вы написали программу prog, запустили её, а она так качественно зависла, что не помогают никакие комбинации, то в выдаче команды ps ах ближе к концу вы, скорее всего, найдёте примерно такую строку:

Опознать нужную строку следует по имени программы (в данном случае ./prog), а номер процесса посмотреть в начале строки (здесь это 2763). Зная этот номер, мы можем применить команду kill, но следует помнить, что по умолчанию она отправляет указанному процессу сигнал SIGTERM, (№15), который тоже может быть перехвачен процессом. Задать другой сигнал можно либо по номеру, либо по названию (TERM, KILL, INT и т. п.). Следующие две команды эквивалентны; обе передают процессу RWVS сигнал SIGKILL:

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

Вторая ситуация гораздо хуже. Процесс мог выполнить системный вызов, то есть обратиться к операционной системе за какой-то услугой, в ходе выполнения которой система перевела его в состояние “непрерываемого сна”, в котором он и остался. Обычно система переводит процессы в такое состояние на доли секунды; если процесс остался в таком виде надолго — в большинстве случаев это означает серьёзные проблемы с вашим компьютером, например, испорченный (физически!) диск. Здесь, к сожалению, не поможет вообще ничего; принудительно вывести процесс из такого состояния невозможно. Впрочем, если у вас начал “сыпаться” диск, скорее всего вам должно быть уже не до процессов.

Узнать, какая из двух ситуаций имеет место, можно из выдачи всё той же команды ps ах. Процесс-зомби отмечается буквой Z в столбце STAT и словом “defunct” в столбце командной строки, примерно так:

Процесс в состоянии “непрерываемого сна” можно отличить по букве D в поле STAT:

Если какой-нибудь процесс находится в таком состоянии хотя бы несколько секунд — это повод проверить, всё ли хорошо с вашим компьютером.

1.4.8. Выполнение в фоновом режиме

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

Допустим, нам потребовалось обновить базу данных для команды locate, которая позволяет находить файлы в системе по части имени. В норме эта база данных обновляется автоматически, но обычно это происходит в ночное время, а если мы привыкли выключать наш компьютер на ночь, то данные, используемые программой locate, могут изрядно устареть. Обновление делается командой updatedb, выполнение которой может занять несколько минут. Ждать её окончания нам бы не хотелось, поскольку эти несколько минут мы могли бы, например, использовать для набора текста в редакторе. Чтобы запустить команду в фоновом режиме, к ней следует в конце приписать символ &, например:

В ответ на нашу команду система сообщает, что задание запущено в фоновом режиме в качестве фоновой задачи №1, причём номер запущенного процесса — 2437. Текущий список выполняемых фоновых задач можно узнать командой jobs:

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

Если же программа при завершении сообщила операционной системе, что не считает своё выполнение успешным (с updatedb такое случается редко, с другими программами — гораздо чаще), сообщение будет иметь другой вид:

Наконец, если фоновый процесс снять сигналом, сообщение будет примерно таким (для сигнала SIGTERM):

При отправлении сигналов процессам, являющимся фоновыми задачами данного конкретного экземпляра командного интерпретатора, можно ссылаться на номера процессов по номерам фоновых задач, добавляя к номеру символ “%”. Так, команда “kill %2” отправит сигнал SIGTERM второй фоновой задаче. Символ “%” без указания номера обозначает последнюю из фоновых задач.

Если задача уже запущена не в фоновом режиме и нам не хочется ждать её завершения, мы можем сделать обычную задачу фоновой. Для этого следует нажать Ctrl-Z, в результате чего выполнение текущей задачи будет приостановлено. Затем с помощью команды bg26 приостановленную задачу можно снова поставить на выполнение, но уже в фоновом режиме. Также возможно сделать текущей (т. е. такой, окончания которой ожидает командный интерпретатор) любую из фоновых и приостановленных задач. Это делается с помощью команды fg27.

Помните: комбинация Ctrl-Z не убивает активную задачу, а лишь временно приостанавливает её выполнение. Это особенно важно для тех, кто привык к работе с “консольными” программами в Windows; там эта комбинация имеет совершенно иной смысл. Если вы привыкли к ней — значит, пора отвыкать.

Отметим, что возможности фонового исполнения особенно полезны при запуске оконных приложений — web-браузера, редактора текстов, работающего в отдельном окне (например, geany) или просто другого экземпляра xterm. Запустив на исполнение такую программу, мы, как правило, совершенно не хотим, чтобы наш командный интерпретатор ждал её завершения, не принимая от нас новых команд.

1.4.9. Перенаправление потоков ввода-вывода

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

Практически все программы в ОС Unix следуют соглашению, по которому поток ввода-вывода с дескриптором 0 объявляется потоком стандартного ввода, поток с дескриптором 1 — потоком стандартного вывода и поток с дескриптором 2 — потоком для вывода сообщений об ошибках. Осуществляя обмен данными через стандартные потоки, большинство программ не делает предположений о том, с чем на самом деле связан тот или иной поток. Это позволяет использовать одни и те же программы как для работы с терминалом, так и для чтения из файла и/или записи в файл. Командные интерпретаторы, в том числе классический Bourne Shell, предоставляют возможности для управления вводом-выводом запускаемых программ. Для этого используются символы <, >, >>, >& и | (см. табл. 1.2).

Таблица 1.2. Примеры перенаправлений ввода-вывода

cmd1 > file1

запустить программу cmd1, направив её вывод в файл file1; если файл существует, он будет перезаписан с нуля, если не существует — будет создан

cmd1 >> file1

запустить программу cmd1, дописав её вывод в конец файла file1; если файла не существует, он будет создан

cmd2 < file2

запустить программу cmd2, подав ей содержимое файла file2 в качестве стандартного ввода; если файла не существует, произойдёт ошибка

cmd3 > file1 < file2

запустить программу cmd3, перенаправив как ввод, так и вывод

cmd1 | cmd2

запустить одновременно программы cmd1 и cmd2, подав данные со стандартного вывода первой на стандартный ввод второй (так называемый конвейер)

cmd4 2> errfile

направить поток сообщений об ошибках в файл errfile

cmd5 2>&1 | cmd6

объединить потоки стандартного вывода и вывода ошибок программы cmd5 и направить на стандартный ввод программы cmd6

Обычно в ОС Unix присутствует программа less, позволяющая постранично просматривать содержимое файлов, пользуясь клавишами “стрелка вверх”, “стрелка вниз”, PgUp, PgDn и др. для прокрутки. Эта же программа позволяет постранично просматривать текст, поданный ей на стандартный ввод. Использование программы less полезно в случае, если информация, выдаваемая какой-либо из запускаемых вами программ, не умещается на экран. Например, команда

позволит вам просмотреть список всех файлов, находящихся в текущей директории и всех её поддиректориях.

Учтите, что многие программы выдают все сообщения об ошибках и предупреждения в стандартный поток ошибок. Чтобы просмотреть постранично сообщения такой программы (например, компилятора gcc), следует дать команду, объединяющую поток ошибок со стандартным потоком вывода и направляющую на вход программы less результат объединения:

Отметим ещё один момент. Если по какой-то причине вам не интересен поток информации, выдаваемый какой-нибудь программой, вы можете перенаправить его в псевдоустройство /dev/null: всё, что туда направлено, просто исчезает. Например, следующая команда сформирует список всех файлов в вашей системе, за исключением тех каталогов, на чтение которых у неё не хватит прав; при этом все сообщения об ошибках будут проигнорированы:

1.4.10. Редакторы текстов

Различных редакторов текстов в операционных системах семейства Unix существует несколько сотен. Ниже приводятся основные сведения о трёх из них.

Выбирая для работы редактор текстов, следует обратить внимание на то, подходит ли он для написания программ. Для этого редактор текстов должен, во-первых, работать с файлами в обычном текстовом формате; во-вторых, редактор не должен выполнять автоматического форматирования абзацев текста (например, MSWord для этой цели непригоден); и, в-третьих, редактор обязан использовать моноширинный шрифт, то есть шрифт, в котором все символы имеют одинаковую ширину. Выяснить, удовлетворяет ли редактор этому свойству, проще всего, набрав в этом редакторе строку из десяти латинских букв m и под ней — строку из десяти латинских букв i. В редакторе, использующем моноширинный шрифт, полученный текст будет выглядеть так:

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

Редактор vim

Редактор vim (Vi Improved) является клоном классического редактора текстов для Unix-подобных операционных систем VI. Работа в редакторах этого семейства может показаться начинающему пользователю несколько неудобной, т. к. по построению интерфейса они коренным образом отличается от привычных большинству пользователей экранных редакторов текстов с системами меню. В то же время многие программисты, работающие под Unix-системами, предпочитают использовать именно эти редакторы, поскольку для человека, умеющего использовать основные функции этих редакторов, именно этот вариант интерфейса оказывается наиболее удобным для работы над текстом программы. Больше того, как показывает опыт автора этих строк, всё это относится не только к программам; текст книги, которую вы читаете, набран в редакторе vim, как и тексты всех остальных книг автора.

В любом случае, если освоение редактора vim покажется вам чрезмерно сложной задачей, к вашим услугам другие редакторы текстов, два из которых описаны ниже. Для читателей, решивших обойтись без изучения vim, приведем для справки последовательность нажатия клавиш для выхода из этого редактора: если вы случайно запустили vim, практически в любой ситуации вы можете нажать Escape, затем набрать :qa!, и это приведёт к выходу из редактора без сохранения изменений.

Чтобы запустить редактор vim, достаточно дать команду vim myfile.c. Если файла myfile.c не существует, он будет создан при первом сохранении изменений. Первое, что необходимо уяснить, работая с vim — это наличие у него двух режимов работы: режима ввода текста и режима команд. Сразу после запуска вы оказываетесь в режиме команд. В этом режиме любые нажатия клавиш будут восприняты как команды редактору, т. е. если вы попытаетесь ввести текст, результат такой попытки вам не понравится.

Перемещение по тексту в режиме команд возможно с помощью стрелочных клавиш, однако более опытные пользователи vim предпочитают пользоваться для этой цели символами j, k, h и l для перемещения, соответственно, вниз, вверх, влево и вправо (см. рис. 1.6).

image9

Рис. 1.6. Перемещение курсора в vim с помощью алфавитных клавиш

Причина такого выбора в том, что в ОС UNIX стрелочные клавиши генерируют последовательность байтов, начинающуюся с кода Esc (27); любая такая последовательность может быть воспринята редактором как требование на переход в командный режим к несколько команд-символов, причём единственный способ отличить Esc-последовательность, порождённую нажатием клавиши, от такой же последовательности, введённой пользователем — это измерение времени между приходом кода Esc и следующего за ним. При работе на медленной линии связи (например, при удалённом редактировании файла в условиях медленной или неустойчивой работы сети) этот способ может давать неприятные сбои.

Несколько наиболее часто употребляемых команд приведены в табл. 1.3. Команды i, а, о, и O переводят вас в режим ввода текста. Теперь всё вводимое с клавиатуры воспринимается как текст, подлежащий вставке. Естественно, возможно использование клавиши Backspace в её обычной роли. В большинстве случаев возможно также использование стрелочных клавиш, но в некоторых версиях vim, при некоторых особенностях настройки, а также при работе через медленный канал связи возможна неправильная реакция редактора на стрелки. В этом случае для навигации по тексту необходимо выйти из режима ввода. Выход из режима ввода и возврат в режим команд осуществляется нажатием клавиши Escape.

Таблица 1.3. Команды редактора vim

ˆ

$

x

dw

dd

d$

J

i

a

о

O

.

u

U

перейти в начало строки

перейти в конец строки

удалить символ под курсором

удалить слово (от курсора до пробела или конца строки)

удалить текущую строку

удалить символы от курсора до конца строки

слить следующую строку с текущей (удалить перевод строки)

начать ввод текста с позиции перед текущим символом (insert)

то же, но после текущего символа (append)

вставить пустую строку после текущей и начать ввод текста

то же, но строка вставляется перед текущей

повторить последнюю операцию

отменить последнюю операцию (undo)

отменить все изменения, внесенные в текущую строку

При необходимости найти в тексте то или иное ключевое слово следует использовать (в командном режиме) последовательность /<word>, завершая её нажатием Enter. Так, /myfun установит курсор на ближайшее вхождение строки myfun в вашем тексте. Повторить поиск можно, введя символ / и сразу же нажав Enter.

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

Таблица 1.4. Файловые команды редактора vim

:w

:w <name>

:w!

:wq

:q

:q!

:r <name>

:e <name>

:ls

:b <N>

сохранить редактируемый файл

записать файл под новым именем

сохранить, игнорируя (по возможности) флаг readonly

сохранить файл и выйти

выйти из редактора (если файл не был изменён с момента последнего сохранения)

выйти без сохранения, сбросив сделанные изменения

прочитать содержимое файла <name> и вставить его в редактируемый текст

начать редактирование еще одного файла

показать список редактируемых файлов (активных буферов)

перейти к буферу номер N

При одновременной работе с несколькими файлами переход между двумя последними редактируемыми файлами, кроме команды :b, также можно осуществить комбинацией клавиш Ctrl-ˆ.

Отдельного упоминания заслуживают команды выделения блоков и работы с блоками. Начать выделение фрагмента, состоящего исключительно из целых строк, можно командой V; выделить фрагмент, состоящий из произвольного количества символов, можно с помощью команды v. Граница выделения устанавливается стрелками или соответствующими командами h, j, k и l.

Удалить выделенный блок можно командой d, скопировать — командой у. В обоих случаях выделение снимается, а фрагмент текста, находившийся под выделением, помещается в специальный буфер. Содержимое буфера можно вставить в текст командами р (после курсора) и Р (перед курсором). Текст может попасть в буфер и без выделения. Так, все команды, удаляющие те или иные фрагменты текста (х, dd, dw, d$ и др.), помещают удалённый текст в буфер. Команды yy, yw, y$ помещают в буфер, соответственно, текущую строку, текущее слово и символы от курсора до конца строки.

Редактор joe

Другой популярный в среде Unix редактор текстов называется joe от слов Jonathan’s Own Editor. Чтобы запустить его, достаточно дать команду joe myfile.c. Если файла myfile.c не существует, он будет создан при первом сохранении изменений. В отличие от редактора vim, интерфейс редактора joe более похож на привычные для большинства пользователей редакторы текстов. Стрелочные клавиши, Enter, Backspace и другие работают в своей обычной роли, в большинстве случаев также доступна клавиша Delete. Команды редактору даются с помощью комбинаций клавиш, большинство из которых начинается с Ctrl-K. В частности, Ctrl-K h покажет в верхней части экрана памятку по наиболее употребительным командам редактора (см. табл. 1.5).

Таблица 1.5. Наиболее употребительные команды редактора joe

Ctrl-K D

сохранить файл

Ctrl-K X

сохранить и выйти

Ctrl-C

выйти без сохранения

Ctrl-Y

удалить текущую строку

Ctrl-K В

отметить начало блока

Ctrl-K K

отметить конец блока

Ctrl-K C

скопировать выделенный блок в новое место

Ctrl-K M

переместить выделенный блок в новое место

Ctrl-K Y

удалить выделенный фрагмент

Ctrl-K L

найти строку по номеру

Ctrl-Shift-’-’

отменить последнее действие (undo)

Ctrl-ˆ

снова выполнить отмененное действие (redo)

Ctrl-K F

поиск ключевого слова

Ctrl-L

повторный поиск

Встроенный редактор оболочки Midnight Commander

Оболочка (файловый монитор) Midnight Commander представляет собой клон некогда популярного файлового менеджера под MS-DOS, известного как Norton Commander. Запуск оболочки производится командой mc. Вызов встроенного редактора текстов для редактирования выбранного файла производится клавишей F4; если вы хотите создать новый файл, используйте комбинацию Shift-F4.

Интерфейс этого редактора достаточно понятен на интуитивном уровне, поэтому подробное описание мы опускаем. Ограничимся одной рекомендацией. Если не предпринять специальных мер, редактор будет вставлять в текст символ табуляции вместо групп из восьми пробелов, что может оказаться неудобным при использовании других редакторов. Единственный способ отключить такой стиль заполнения — установить опцию “Fill tabs with spaces”. Чтобы добраться до диалога с настройками, нажмите F9, выберите пункт меню “Options”, в нём — пункт “General”. Чтобы настройки не потерялись при выходе из Midnight Commander, сохраните их. Для этого, выйдя из редактора, нажмите F9, выберите пункт меню “Options”, а в нём — пункт “Save Setup”.

1.4.11. Права доступа к файлам

С каждым файлом в ОС Unix связано 12-битное слово, называемое “правами доступа” к файлу28. Младшие 9 бит этого слова объединены в три группы по три бита; каждая группа задаёт права доступа для владельца файла, для его группы и для всех остальных пользователей. Три бита в каждой группе отвечают за право чтения файла, право записи в файл и право исполнения файла. Чтобы узнать права доступа к тому или иному файлу, можно воспользоваться командой ls -l, например:

Расположенная в начале строки группа символов -rwxr-xr-x показывает тип файла (минус в самом начале означает, что мы имеем дело с обыкновенным файлом, буква d означала бы каталог и т. п.) и права доступа, соответственно, для владельца (в данном случае rwx, т. е. чтение, запись и исполнение), группы и всех остальных (в данном случае r-x, т. е. права на запись отсутствуют). Как мы видим, файл /bin/cat доступен любому пользователю на чтение и исполнение, но модифицировать его может только пользователь root (администратор системы).

Поскольку группа из трёх бит соответствует ровно одной цифре восьмеричной системы счисления29, общепринятой является практика записи слова прав доступа к файлу в виде восьмеричного числа, обычно трёхзначного. При этом младший разряд (последняя цифра) соответствует правам для всех пользователей, средняя — правам для группы и старшая (обычно она идёт самой первой) цифра обозначает права для владельца. Права на чтение соответствуют 1, права на запись — 2, права на чтение — 4; соответствующие значения суммируются, т. е., например, права на чтение и запись обозначаются цифрой 6 (4 + 2), а права на чтение и исполнение — цифрой 5 (4 + 1). Права доступа к файлу /bin/cat из нашего примера можно закодировать восьмеричным числом 075530.__________

Для каталогов интерпретация битов прав доступа несколько отличается. Права на чтение каталога дают возможность просмотреть его содержимое. Права на запись позволяют модифицировать каталог, т. е. создавать и уничтожать в нём файлы (причём удалить можно и чужой файл, а также такой, на который прав доступа нет, т. к. достаточно иметь права доступа на запись в сам каталог). Что касается бита прав “на исполнение”, для каталога этот бит означает возможность каким- либо образом использовать содержимое каталога, в том числе, например, открывать файлы, находящиеся в каталоге. Таким образом, если на каталог установлены права чтения, но нет прав исполнения, мы можем его просмотреть, но воспользоваться увиденным нам не удастся. Напротив, если есть права исполнения, но нет прав чтения, мы можем открыть файл из этого каталога только в том случае, если точно знаем имя файла. Узнать имя мы никак не можем, т. к. возможности просмотреть каталог у нас нет.

Оставшиеся три (старших) разряда слова прав доступа называются SetUid Bit (04000), SetGid Bit (02000) к Sticky Bit (01000). Если для исполняемого файла установить SetUid Bit, этот файл будет при исполнении иметь права своего владельца (чаще всего — пользователя root) вне зависимости от того, кто из пользователей соответствующий файл запустил. SetGid Bit работает похожим образом, устанавливая исполнение от имени группы владельца файла вместо группы запустившего программу пользователя. Примером suid-программы является passwd. Sticky Bit, установленный на исполняемом файле, в старых версиях ОС Unix означал, что сегмент кода программы следует оставить в памяти даже после того, как программа будет завершена; это позволяло экономить время на загрузке в память программ, исполняемых чаще других. Современные системы сами решают, какие файлы следует оставить в памяти, и делают это в среднем эффективнее, чем мог бы сделать администратор; sticky bit на исполняемых файлах современными системами игнорируется.

Для каталогов SetUid Bit и SetGid Bit означают, что какой бы пользователь ни создал в этом каталоге файл, в качестве, соответственно, “владельца” и “группы владельца” для этого файла будут установлены те же владелец и группа, что и у самого каталога. Sticky Bit означает, что даже если пользователь имеет право на запись в данный каталог, удалить он сможет только свои (принадлежащие ему) файлы.

Для изменения прав доступа к файлам используется команда chmod31. Эта команда позволяет задать новые права доступа в виде восьмеричного числа, например

устанавливает для файла myfile.c права записи только для владельца, а права чтения — для всех.

Права доступа также можно задать в виде мнемонической строки вида [ugoa][+-=][rwxsXtugo] Буквы u, g, о и а в начале означают, соответственно, владельца (user), группу (group), всех остальных (others) и всех сразу (all). “+” означает добавление новых прав, “-” — снятие старых прав, “=” — установку указанных прав и снятие всех остальных. После знака буквы r, w, х означают, как можно догадаться, права на чтение, запись и исполнение, буква s — установку/снятие Set-битов (имеет смысл для владельца и группы), t обозначает Sticky Bit. Буква X (заглавная) означает установку/снятие бита исполнения только для каталогов, а также для тех файлов, на которые хотя бы у кого-нибудь есть права исполнения. Если команду chmodиспользовать с флажком -R, она проведёт смену прав доступа ко всем файлам во всех поддиректориях заданной директории. Например, команда chmod a+x myscript сделает файл myscriptисполняемым; команда chmod go-rwx * снимет со всех файлов в текущем каталоге все права, кроме прав владельца. Очень полезной может оказаться команда

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

1.4.12. Электронная документация

Дистрибутивы ОС Unix обычно содержат большое количество документации, доступ к которой можно получить непосредственно в процессе работы. Большая часть такой документации оформлена в виде файлов, отображаемых с помощью команд man (от слова manual) и info.

Команда man

Команда man служит для поиска и отображения установленной в системе справочной информации. Справочник охватывает команды ОС Unix, системные вызовы, библиотечные функции языка Си (и других установленных в системе языков), форматы файлов, некоторые общие понятия и т. д. К примеру, если вы хотите узнать все опции команды Is, следует дать команду “man ls”, а если вы, допустим, забыли, в каком порядке идут аргументы системного вызова waitpid(), вам поможет команда “man waitpid”. Программа man найдёт соответствующий документ в системном справочнике и запустит программу его отображения. Появившийся на экране документ можно листать с помощью клавиш “стрелка вверх” и “стрелка вниз”, можно использовать клавишу “пробел”, чтобы пропустить сразу страницу текста. Выход из просмотра справочного документа осуществляется клавишей q (от слова quit).

Если нужный вам справочный документ имеет большой объём, а вам необходимо найти в нём определённое место, может оказаться удобным поиск подстроки. Это делается вводом символа /, после которого следует набрать строку для поиска и нажать Enter. Повторный поиск той же строки осуществляется вводом / и нажатием Enter (то есть саму строку можно опустить). Чтобы выполнить поиск в обратном направлении, можно воспользоваться символом ? вместо /.

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

выдаст именно документ, посвящённый системному вызову write, поскольку секция №2 содержит справочные документы по системным вызовам. Перечислим другие секции системного справочника:

• 1 — пользовательские команды ОС Unix (такие команды, как ls, rm, mv и т. п. описываются в этой секции);

• 2 — системные вызовы ядра ОС Unix;

• 3 — библиотечные функции языка Си (к этой секции можно обратиться, например, за информацией о функции sprintf);

• 4 — описания файлов устройств;

• 5 — описания форматов системных конфигурационных файлов;

• 6 — игровые программы;

• 7 — общие понятия (например, man 7 ip выдаст полезную информацию о программировании с использованием TCP/IP);

• 8 — команды системного администрирования ОС Unix (например, в этой секции вы найдёте описание команды mount, предназначенной для монтирования файловых систем).

Справочник может содержать и другие секции, причём не обязательно обозначающиеся цифрой; так, при установке в системе интерпретатора языка Tel его справочные страницы обычно оформляются в отдельную секцию, которая может называться “n”, “3n” и т. п.

Команда info

Если команда man служит для отображения отдельных документов, то команда info позволяет осуществлять просмотр целых наборов страниц, связанных между собой гиперссылками; иначе говоря, документы в формате info представляют собой гипертекст, а сама команда — браузер (просмотрщик) гипертекста, работающий в текстовом режиме. Система info часто содержит более подробную информацию о том же предмете, чем man. Так, man make выдаст довольно скудную информацию об опциях командной строки команды make, в то время как info make позволит основательно изучить работу с программой make, научиться составлять её входные файлы и т. д.

При работе с программой info можно пролистывать текст с помощью клавиш стрелок и пробела. Клавиши n и р позволяют перейти, соответственно, к следующей и предыдущей странице гипертекста. Гиперссылки в тексте заключены между знаком * и ::, например:

Если позиционировать курсор на словах Reading Makefiles и нажать Enter, произойдёт переход по данной гиперссылке. Если необходимо перейти назад, можно воспользоваться клавишей l (от слова last). Выход из программы info производится клавишей q (от слова quit) или нажатием Ctrl-C.

1.4.13. Командные файлы в Bourne Shell

Интерпретатор Bourne Shell может не только работать в режиме диалога с пользователем, но и выполнять программы, которые называются командными файлами (скриптами). Файл с программой, предназначенной для исполнения интерпретатором Bourne Shell, должен начинаться со строки

Переменные в языке Bourne Shell имеют имена, состоящие из латинских букв, цифр, знака подчёркивания и начинающиеся всегда с буквы. Значением переменной может быть любая строка символов. Чтобы присвоить переменной значение, нужно написать оператор присваивания, например:

Обратите внимание, что в имени переменной, а также вокруг знака равенства (символа присваивания) не должно быть пробелов, в противном случае команда будет расценена не как присваивание, а как обычная команда, в которой знак присваивания — один из параметров. Для обращения к переменной используется знак $, например:

В результате выполнения этой команды будет напечатано:

При необходимости скомпоновать слитный текст из значений переменных можно имена переменных заключать в фигурные скобки; например, команда “echo ${I}аbс” напечатает “10аbс”.

Для выполнения арифметических действий используется конструкция $(( )). Например, команда “I=$(( $I + 7 ))” увеличит значение переменной I на семь.

С помощью встроенной в интерпретатор Bourne Shell команды test можно осуществлять проверку выполнения различных условий. Если заданное условие выполнено, команда завершится с нулевым (успешным) кодом возврата, в противном случае — с единичным (неуспешным). Синонимом команды test является символ открывающей квадратной скобки, причём сама команда в этом случае воспринимает символ закрывающей квадратной скобки в качестве своего параметра (как знак окончания выражения), что позволяет наглядно записывать проверяемое выражение, заключая его в квадратные скобки. Приведём несколько примеров.

Это можно, например, использовать в операторе ветвления:

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

В качестве команды, проверяющей условие, может фигурировать не только test, но и любая другая команда. Например:

Кроме оператора ветвления, язык Bourne Shell поддерживает и более сложные конструкции, в том числе циклы. Например, следующий фрагмент напечатает все числа от 1 до 100:

Использовать информацию об успешности выполнения команды можно также с помощью так называемых логических связок && и ll, означающих, соответственно, логические операции “и” и “или”. При этом логическому значению “истина” соответствует успешное завершение команды, а значению “ложь” — неуспешное. Командная строка

заставит интерпретатор выполнить сначала команду cmd1; а команда cmd2 будет выполнена только в случае, если cmd1 завершилась успешно. Наоборот, командная строка

подразумевает запуск cmd2 в случае неуспешного завершения cmd1.

Приоритет логических связок между собой — традиционный (то есть “и” приоритетнее, чем “или”), В то же время приоритет операций “конвейер” к перенаправлений ввода-вывода выше, чем приоритет логических связок; так, команда

представляет собой связку между командой cmd1 и конвейером cmd2 I cmd3 как целым. Значение “истинности” конвейера определяется успешностью или неуспешностью выполнения последней из составляющих его команд. Очерёдность применения операций, как обычно, можно изменить использованием круглых скобок, например:

В этом примере стандартный вывод команд cmd1 и cmd2 (если, конечно, она вообще будет выполняться) будет направлен на стандартный ввод cmd3.

Для более подробной информации о программировании на языке Bourne Shell следует обратиться к специальной литературе [1].

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

Выполняющиеся в ОС Unix программы имеют возможность получать некоторую (обычно связанную с глобальными настройками) информацию из так называемых переменных окружения. Окружение фактически представляет собой множество текстовых строк вида VAR=VALUE, где VAR — имя переменной, a VALUE — её значение.

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

Одной из наиболее важных является переменная с именем PATH. Эта переменная содержит список каталогов, в которых следует искать исполняемый файл, если пользователь дал команду, не указав каталог. Стоит также упомянуть переменную HOME, содержащую путь к домашнему каталогу пользователя; переменную LANG, по которой многоязычные приложения определяют, на каком языке следует выдавать сообщения; переменную EDITOR, в которую можно занести имя предпочитаемого редактора текстов. Разумеется, список переменных окружения этим не исчерпывается. Весь набор имеющихся в вашем окружении переменных можно увидеть, дав команду set без параметров.

Интерпретатор командной строки предоставляет возможности по управлению переменными окружения. Во-первых, при старте интерпретатор копирует всё окружение в свои собственные переменные (заметим, что внутренние переменные интерпретатора организованы так же, как переменные окружения, а именно — в виде набора строк вида VAR=VALUE), так что к ним можно обратиться:

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

или просто

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

Переменную можно убрать из окружения с помощью команд unset и export:

Модификация окружения влияет на выполнение всех команд, которые мы даем интерпретатору, поскольку запускаемые интерпретатором процессы наследуют уже модифицированный набор переменных окружения. Кроме того, при необходимости можно отдельно взятую команду запустить с модифицированным только для неё окружением. Это делается примерно так:

Так, в ОС FreeBSD можно сменить информацию о пользователе, включая используемый командный интерпретатор, с помощью команды chfn, которая предлагает к редактированию определённый текст, из которого затем извлекает нужные значения. Эта команда по умолчанию запускает редактор текстов vim, что не для всех пользователей удобно. Выйти из положения можно, например, так:

В этом случае будет запущен редактор joe.

1.4.15. Протоколирование сеанса работы

При выполнении заданий практикума часто требуется представить протокол сеанса работы с программой, т. е. текст, включающий как информацию, вводимую пользователем, так и информацию, выдаваемую программой. Это легко сделать с помощью команды script. Чтобы начать протоколирование, запустите команду script с одним параметром, задающим имя файла протокола. Для окончания протоколирования нажмите Ctrl-D (“конец файла”). Например:

Файл my_protocol.txt теперь содержит протокол сеанса работы:

1.4.16. Графическая подсистема в ОС Unix

Общие сведения

В отличие от некоторых других систем, ОС Unix сама по себе не включает никаких средств поддержки графического интерфейса. Для работы в графическом режиме в ОС Unix используется программный комплекс под общим названием X Window System, который состоит из обычных пользовательских программ и не является, вообще говоря, частью операционной системы.

Иногда можно встретить в литературе к разговорах наименование “XWindows”. Такое наименование является категорически неправильным, что создатели системы X Window настойчиво подчеркивают. Слово “window” (окно) в наименовании этой системы должно стоять в единственном числе.

Центральным компонентом X Window System является программа, отвечающая за отображение графической информации на дисплее пользователя. Эта программа называется Х-сервером. Все приложения, использующие графику, обращаются к X-серверу с запросами на вывод того или иного изображения; таким образом, Х-сервер предоставляет приложениям услугу (сервис) отображения графической информации, откуда и происходит название “Х-сервер”. Программы, обращающиеся к Х-серверу (то есть все программы, работающие в ОС Unix и использующие графику), называются, соответственно, Х-клиентами.

Отдельного упоминания заслуживают Х-клиенты специального типа, называемые оконными менеджерами. Оконный менеджер отвечает за обрамление появляющихся на экране окон — отрисовывает рамки и заголовки окон, позволяет перемещать окна по экрану и менять их размеры. Авторам других графических программ, как следствие, не нужно думать о декоре окна; обычно Х-приложение отвечает только за отрисовку прямоугольной области экрана, не имеющей ни рамки, ни заголовка, ни прочих стандартных элементов декора окна. С другой стороны, и пользователь в этой ситуации может выбрать из нескольких оконных менеджеров тот, который лучше отвечает его индивидуальным склонностям и потребностям.

Автор в свое время любил демонстрировать “непосвященным” простенький фокус, состоявший в замене “на лету” оконного менеджера с аскетично выглядящего fvwm2 на fvwm95, в мельчайших подробностях копирующий внешний вид MS Windows-95. Особенно почему-то впечатляет зрителей тот факт, что открытые приложения при этом никуда не деваются.

Одной из самых популярных Х-клиентских программ является xterm — эмулятор алфавитно-цифрового дисплея для Х Window. В работе может быть удобно завести одновременно несколько экземпляров процесса xterm, каждый из которых порождает своё окно, в котором запускает копию интерпретатора командной строки. В одном окне мы можем запускать редактор vim, в другом —- выполнять трансляцию и отладку, в третьем — запускать тестовые программы и т. д.

Запуск X Window и выбор оконного менеджера

В зависимости от конфигурации конкретной машины система Х Window может оказаться уже запущена, либо вам будет нужно запустить её самостоятельно. Обычно это делается с помощью команды startx, которая, в свою очередь, запускает программу xinit.

Возможно, в вашей локальной сети присутствует машина, выполняющая роль сервера приложений на основе xdm; к такой машине можно подключиться с помощью штатных средств X Windowтаким образом, что все ваши программы будут выполняться на этой (удалённой) машине, а на вашем локальном рабочем месте будет осуществляться только отображение их графических окон, т. е. ваш компьютер будет играть роль X-терминала. Чтобы проверить, есть ли в вашей сети xdm-сервера, попробуйте дать команду “X-broadcast” Если xdm-сервер в вашей сети действительно есть, после переключения в графический режим вы увидите приглашение к вводу имени и пароля для входа на этот сервер. Если xdm-серверов в сети больше одного, сначала вы увидите их список с предложением выбрать, услугами какого из них вы желаете воспользоваться. Если в течение 1520 секунд после перехода в графический режим ничего подобного не произошло — скорее всего, xdm-сервер в вашей сети отсутствует.

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

Если конфигурация системы вас по тем или иным причинам не устраивает, вы можете настроить её по своему вкусу путём создания в домашней директории файла с именем .xinitrc (либо его редактирования, если такой файл уже есть). Обратите внимание на точку перед именем файла, она важна. По сути .xinitrc представляет собой командный файл, из которого запускаются прикладные программы, включая и сам оконный менеджер. Программа xinit запускает Х-сервер, а затем, соответствующим образом установив переменные окружения, начинает выполнение команд из .xinitrc. Завершение выполнения .xinitrc означает завершение сеанса работы с Х Window, при этом процесс Х- сервера завершается. Простейший пример .xinitrc может выглядеть примерно так:

В этом случае сначала будет запущен xterm (его мы запускаем на всякий случай, чтобы можно было работать, даже если оконный менеджер имеет неудобную конфигурацию), после чего — стандартный оконный менеджер twm. Обратите внимание, что xterm запускается в фоновом режиме (для этого в конце первой строки поставлен знак &). Это сделано, чтобы не ожидать его завершения для запуска twm.

Оконный менеджер twm достаточно примитивен. Хотя некоторые пользователи Unix используют именно его32, вы, возможно, захотите попробовать другие оконные менеджеры. В вашей системе могут быть установлены, кроме twm, такие оконные менеджеры, как FVWM, IceWM, WindowMaker, Fluxbox и другие; кроме того, вы можете обнаружить и более развитые ОМ, такие как KDE и GNOME33. Чтобы воспользоваться IceWM, измените ваш .xinitrc:

Если вы предпочитаете KDE, ваш файл может выглядеть так:

Выбор конкретного оконного менеджера среди множества доступных зависит в основном от ваших личных предпочтений. Так, стандартный ОМ twm выглядит достаточно аскетично, тогда как KDE по вычурности своего графического дизайна, пожалуй, превосходит системы семейства Windows. В то же время KDE весьма требователен к ресурсам и ощутимо “тормозит” даже на сравнительно быстрых компьютерах, тогда как аскетичные twm, fvwm и даже достаточно развитый в дизайнерском отношении icewm работают с приемлемой скоростью даже на компьютерах с процессорами Pentium-1 (KDE на таких машинах лучше и не пробовать запускать).

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

Работа с классическими оконными менеджерами

К классическим ОМ мы относим twm, fvwm и некоторые другие. Следует отметить, что любой оконный менеджер имеет весьма развитые средства настройки, позволяющие существенно изменить его поведение, так что дать исчерпывающую инструкцию по работе с каким-либо из оконных менеджеров на уровне “нажмите такую-то клавишу для получения такого-то результата” было бы затруднительно. В этом параграфе мы ограничимся общими рекомендациями, которые позволят вам быстро освоить работу с вашим оконным менеджером в той конфигурации, которая установлена в вашей системе. При желании вы можете изменить любые настройки оконного менеджера; за инструкциями по этому поводу следует обратиться к технической документации.

Итак, первое, что можно посоветовать после запуска оконного менеджера — это попытаться понять, каким образом в нем высветить главное меню. Во всех классических ОМ главное меню выдаётся, если щёлкнуть левой кнопкой мыши в любом свободном месте экрана (то есть в таком месте, которое не закрыто никакими окнами). Отметим, что в классических ОМ не поддерживается ничего похожего на “пиктограммы на рабочем столе”, так что запуск программ можно осуществить либо через меню, либо с помощью командной строки, доступ к которой можно получить, запустив программу xterm или аналогичную. Обычно xterm или какой-то его аналог имеется либо в самом главном меню, либо в его подменю, называемом “terminals”, “shells” и т. п. Если у вас уже есть одно окошко с командной строкой, можно запустить новый экземпляр xterm, дав команду

Обратите внимание на символ “&”. Программу xterm мы запускаем в фоновом режиме, чтобы старый экземпляр xterm (с помощью которого мы даём команду) не ждал его завершения: в противном случае запуск нового xterm теряет смысл, ведь у нас во время его работы не будет возможности пользоваться старым экземпляром.

Программа xterm имеет развитую систему опций. Например,

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

Классическим в системе X Window считается поведение, при котором фокус ввода находится в том окне, в котором расположен курсор мыши34. Такое соглашение позволяет, например, работать с окном, которое частично скрыто другими окнами, не вытаскивая его на верхний уровень. Такое поведение (именуемое FocusFollowsMouse), однако, может оказаться непривычным; при необходимости его можно сменить на более привычное, называемое ClickToFocus, с помощью настроек вашего оконного менеджера. В любом случае следите внимательно за положением курсора мыши.

Показать полностью (поднять на верхний уровень) окно, которое частично скрыто, можно, щёлкнув мышью по его заголовку (а не по любому месту окна). Ваши настройки могут предусматривать и обратную операцию (“утопить” окно, показав то, что под ним) — обычно это делается “щелчком” правой кнопки мыши по заголовку. Для перемещения окна по экрану также служит его заголовок: достаточно навести на заголовок курсор мыши, нажать (и не отпускать) левую кнопку, выбрать новое положение окна и отпустить кнопку. Если заголовка окна не видно (например, он скрыт под другими окнами), ту же операцию можно проделать с помощью вертикальных и горизонтальных частей рамки окна, кроме выделенных участков в уголках рамки; эти угловые участки служат для изменения размеров окна, то есть при протягивании их мышкой перемещается не всё окно, а только тот его уголок, который вы захватили.

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

В большинстве случаев оконные менеджеры поддерживают так называемый виртуальный рабочий стол (virtual desktop), состоящий из нескольких “виртуальных экранов”, на каждом из которых можно разместить свои окна. Это бывает удобно, если вы работаете одновременно с большим количеством окон. Карта виртуального рабочего стола, на которой изображены виртуальные экраны, обычно находится в правом нижнем углу экрана; чтобы переключиться на нужный вам виртуальный экран, достаточно щёлкнуть мышью в соответствующем месте карты.

Из окон, в которых отображается некий текст, обычно можно скопировать этот текст в другие окна. Для этого достаточно выделить текст мышью; в большинстве программ, работающих под управлением X Window, нет специальной операции “сору”: копируется тот текст, который выделен. Вставка выделенного текста осуществляется третьей (средней) кнопкой мыши. Скорее всего, ваша мышь оснащена “колесом” для скроллинга; обратите внимание на то, что на это колесо можно нажать сверху вниз, не прокручивая его, и тогда оно сработает как обычная (третья) кнопка, что вам, собственно, и требуется.






Для любых предложений по сайту: [email protected]