Знакомство с Linux. Часть 5. Осваиваемся в терминале: ls, man, apropos...

Для чего нам вообще нужен компьютер?

Странный вопрос, да? Путешествовать по Сети, работать с текстами, сканировать фотографии, играть в игры... Да мало ли! В любом случае, чем бы мы ни занимались за клавиатурой родимого ПК, всякий раз приходится иметь дело с информацией. А информация хранится на компьютере в виде файлов.

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

Файловая система, применяемая по умолчанию в Red Hat Linux 7.3, носит название ext3 и служит развитием стандартной для Linux последних нескольких лет системы ext2. Фактически, ext3 - это ext2, оснащённая функциями журналирования. Если для вас термин "журналирование" ассоциируется скорее с фуршетами и презентациями, чем со структурными особенностями файловых систем, не забивайте себе пока этим голову. Сейчас имеет смысл отметить, что журналирование с пользовательской точки зрения делает систему устойчивее к сбоям. Если, допустим, из-за скачка напряжения (и отсутствия источника бесперебойного питания) ваш компьютер внезапно перезагрузится, файловая система без журналирования принуждена будет потратить известное время на поиск (возможно появившихся на диске) сбойных секторов. В то время как система с журналированием просто вернётся к предшествующей моменту сбоя записи в системном журнале и восстановит в соответствии с ней состояние всех открытых и изменявшихся на тот момент файлов.

Наверняка кое-кто из наших читателей сможет вызвать в памяти волнующий процесс перехода от файловой системы FAT16, применявшейся в MS-DOS и Windows 3.1, к сверхсовременной FAT32, разработанной специально для Windows 95. Пользователей потрясали открывшиеся перед ними возможности: не надо было больше ограничивать себя восемью буквами для названия файла и тремя для его расширения! Можно было именовать файлы по-русски, да ещё и не просто словами, а целыми предложениями, включающими заглавные и строчные буквы, пробелы, запятые, восклицательные знаки!.. Очень хорошо помню, как запустил однажды свеженькую английскую версию нортоновских утилит на винчестере, где была установлена русская редакция Windows 95 OSR2. Какие замечательные утилиты, думал я, сколько ошибок они находят, как резво их исправляют... Ошибками оказались длинные кириллические имена файлов и директорий, включая и пресловутую папку "Мои документы", и ещё много системного уровня важности локаций... В итоге, кое-как выцепив критичные для дальнейшей работы данные из перелицованных до полной неузнаваемости файлов, переустановив систему, я навсегда зарёкся именовать в какой бы то ни было ОС файлы и каталоги по-русски. Впрочем, это к нашему разговору прямого отношения не имеет.

В системе ext2 (и ext3) имя файла не может содержать более 256 символов, зато символами этими могут являться буквы, цифры, символы подчёркивания. Таков стандарт, хотя он (за исключением ограничения на длину файла) и не является догмой. Red Hat Linux 7.3 и в консольном, и в графическом режиме прекрасно справляется с файлами, содержащими в названии пробелы, знаки препинания (кроме звёздочки (*), вопросительного знака и косой черты) и даже лежащие за пределами классических кодов ASCII буквы - с некоторыми ограничениями, впрочем.


Строго говоря, допустимо даже (то есть отображается и воспринимается системой) обозначение файлов символами отличных от английского алфавитов. По крайней мере, если уже находясь в Linux, вы захотите создать некий файл и назвать его по-русски, это у вас получится. (Как создавать и редактировать текстовые файлы, мы с вами узнаем уже совсем скоро). Другое дело, что многие самостоятельные программы, написанные сравнительно давно и не модернизировавшиеся просто потому, что прекрасно работают в рамках системных стандартов, могут при встрече с подобными файлами повести себя непредсказуемо. Например, программы автономного резервного копирования чрезвычайно нервически воспринимают любые не-ASCII символы в названиях каталогов и файлов, и либо игнорируют подобные объекты, либо аварийно завершают свою работу. Что и в том, и в другом случае приносит администратору компьютера не слишком много радости. А если, кстати говоря, русскоязычное (допустим) наименование было дано файлу в другой операционной системе - ах, как любит у нас народ называть mp3-файлы по-русски! - то такое покушение на здравый смысл файловая система вообще отказывается внятно воспринимать, демонстрируя вместо наименований файлов ряды вопросительных знаков.


Если имя файла начинается в ext3 с точки (то есть, с точки зрения FAT32, если оно состоит из одного только расширения), такой файл, как правило, является конфигурационным, для повседневного использования непосредственно человеком не предназначенным. Эти файлы концентрируются, как правило, в самом корне домашнего каталога пользователя, и даже у только-только заведённого в системе юзера их уже немало. Чтобы не мельтешить постоянно перед глазами, эти файлы обыкновенно прячутся от команд отображения содержимого каталога - ls и dir, показываясь во всей красе только по специальному приглашению ls -a. Кстати, в системе ext3 нет особого "признака скрытности", которым характеризуются некоторые системные файлы MS-DOS и Windows. Зато у файлов Linux имеется множество других, гораздо более полезных признаков.


Вот и настал прекрасный случай подробнее познакомиться с одной из важнейших консольных команд Linux. Как видим, она состоит из собственно команды (в данном случае ls) и некоторых параметров ("al" в данном примере). Кроме того, если результатом действия команды является не вывод информации на терминал, а операция с файлом, то последним (как правило) аргументом должно быть указано имя этого файла.

В нашем примере команда ls была исполнена с двумя параметрами, "l" и "a", объединёнными в группу вслед за ключом - (минус), как раз и указывающим на то, что вплотную стоящие за ним символы - именно параметры, а не что-либо иное. Ключ "a" заставляет ls отображать начинающиеся с точки файлы; это мы уже знаем. Между прочим, обратите внимание: первые позиции в списке занимают некие "точка" и "две точки", выделенные к тому же синим цветом. "Две точки" должны быть знакомы тем, кто привык в Windows работать с файловыми менеджерами вроде FAR: это ссылка на директорию верхнего уровня. А вот одна точка - это ссылка на текущую директорию; ту самую, которая и отображается здесь. Зачем каталогу содержать ссылку на себя же? Это нужно для того, чтобы соблюдать синтаксис некоторых команд (скажем, перемещения или копирования файлов), требующих указания целевой директории в качестве аргумента. Если файл нужно скопировать в текущий каталог, то вместо того чтобы указывать его абсолютное имя (доступное по команде pwd, помните?), достаточно поставить в качестве этого аргумента точку.

Ключ "l" указывает на то, что отображаться должно не только имя каждого файла в директории, но и некоторая дополнительная информация. А именно:

1. Тип файла. Первая литера в каждой строке указывает на тип: прочерк (-) обозначает обычный файл, буква "d" - каталог, "l" - символическую ссылку (некий аналог ярлыка в Windows, об этом позже). Имеются и другие типы ("b", "c", "p", "s"), но нам они пока не интересны.

2. Права доступа. Это группа из девяти литер сразу вслед за обозначением типа. На каждый файл в файловой системе ext3 (и в операционной системе Linux) имеют какие-либо права три категории пользователей: владелец данного файла, группа, к которой принадлежит владелец, и все прочие пользователи (включая, допустим, тех, кто подсоединяется к данному компьютеру по анонимному FTP). Права могут быть трёх видов: на чтение файла (просмотр содержимого каталога), на запись в файл (в каталог) и на исполнение файла (на вход в каталог). Таким образом и получаются девять полей: сперва отображаются права на чтение-запись-исполнение для хозяина файла, затем для его группы и, наконец, для всех остальных. Сейчас не будем здесь останавливаться подробно, но в скором времени научимся менять права доступа к файлам и каталогам, скрывая тем самым от нескромных взоров чувствительную информацию безо всяких дополнительных усилий.

3. Число ссылок на данный файл. Опять-таки, углубляться в изучение этого вопроса нам пока не с руки. Отметим только, что хотя в приведённом примере файл copy.txt очевидно является ссылкой на test.txt, для test.txt в соответствующей колонке указана единичка, как и для всех прочих файлов (не каталогов). Дело в том, что в этой позиции подсчитываются только так называемые жёсткие ссылки, в отличие от мягких, или символических, каковую как раз и представляет собой в нашем примере copy.txt. Мягкая ссылка действительно очень похожа на ярлык Windows: это небольшой текстовый файл, содержащий в себе абсолютный путь к файлу-мишени, на который он указывает. А вот жёсткая ссылка - это просто другое имя того же самого файла. Причём понятие "правильного" или "исходного" имени отсутствует; файл существует до тех пор, пока с диска не удалена последняя из жёстких ссылок на него. Вот почему так важно отображать число этих ссылок в полном перечне свойств файла.

4. Дальше в паре колонок указываются имя владельца файла и имя группы, к которой владелец принадлежит. Наш пример не слишком удачен в том смысле, что каждый владелец файлов в нём входит в группу своего же собственного имени. Однако это показательный пример: root, суперпользователь, входит в группу root именно потому, что он супер: странно было бы давать аналогичные привилегии (а включение в группу с сильными правами подразумевает хотя бы частичное делегирование этих прав) кому-то ещё. Что же касается пользователя dummy, то его учётная запись была создана в системе с применением стандартных средств (каких и как именно - мы скоро узнаем), а по умолчанию для каждого нового пользователя автоматически создаётся именно ему одному присущая группа того же наименования. Опять-таки, из соображений безопасности и конфиденциальности. Потому уже дело системного администратора вручную или при помощи скрипта создать осмысленные группы - скажем, users, guests, sysops, - задать их полномочия и распределить по ним пользователей.

5. За наименованиями владельцев и групп следует колонка, содержащая размеры файлов в байтах. Для каталогов указывается в данном случае размер файла каталога, поскольку и сама директория в файловой системе ext3 представляет собой файл, содержащий перечень всех включённых в эту директорию каталогов и файлов.

6. Колонка с датой и временем последней модификации файла содержит информацию в несколько непривычном для пользователей Windows, но весьма удобном (если привыкнуть к нему) формате. С месяцем и днём всё понятно, они на месте, а вот куда девался год? Оказывается, интеллектуальная команда ls (точнее, её интеллектуальные разработчики) подходит к данному вопросу творчески. Если с момента последнего изменения файла/каталога до момента исполнения этой команды прошло не более полугода, то на том месте, где должен указываться год, печатаются час и минута модификации. А вот если шесть месяцев уже миновали, то пользователю - как считают разработчики ls - уже не так важны часы и минуты. И в принципе, это - здравый подход. Конечно, и для давным-давно остававшихся нетронутыми файлов можно добиться отображения точного времени их последнего изменения, но такое вот поведение команды ls по умолчанию очень полезно иногда. Свежие файлы сразу бросаются в глаза.

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

Для заинтересовавшихся более подробным рассмотрением тонкостей организации команды ls (а сколько ещё есть команд в Linux, и сколько тонкостей в них!) сразу порекомендую самый легкодоступный источник информации по подобным вопросам: команду man. RTFM помните? Вот тот самый M доступен практически для любой команды (и даже для многих конфигурационных файлов). Просто введите man имя_команды.


Многие (но не все) man-страницы в Red Hat Linux 7.3 будут отображаться локализованными (на русском то есть), если вы при установке системы выбрали русский в качестве основного языка. Именно в этом же случае, кстати, будут русифицированы системные обозначения месяцев (мы с ними уже встречались в колонке даты команды ls -al) и дней недели.

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


Так, набрав apropos mp3, можно узнать, что в системе имеется mpg321 - mp3-плеер, работающий прямо из командной строки! Ну-ка, ну-ка... Открываем страницу руководства по этой команде - man mpg321


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

Так, сообразим: на диске D в Windows у меня хранится немалых размеров коллекция оцифрованной музыки. Как добраться до неё из Linux? Я помню, что при установке системы монтировал диск С на раздел /dos-c, а D - на /dos-d, соответственно. Надо убедиться, что при старте Linux монтирование всех файловых систем, в том числе и этих, прошло нормально. На этот случай у нас имеется команда df


Синтаксис её самоочевиден: наименование системы - размер в килобайтах - объёмы используемого и доступного пространства - используемое пространство в процентах к общему, занимаемому данной системой - точка монтирования. Да! И диск C, и D мне доступны. Так, и что же там, на D...


Ага, есть директория /dos-d/musics, которая, очевидно, в Windows называется D:\musics\. Последовательно добираемся до показа содержимого /dos-d/musics/mixable/Unsorted/... Помните самую первую иллюстрацию к сегодняшнему рассказу? Вот мы к ней и вернулись. Сейчас заиграет музыка.

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

Вот нам нужно набрать длинное абсолютное имя файла (как то, что мы сейчас укажем в качестве аргумента утилите mpg321). А набирать лениво, да и не одну ошибку можно совершить в процессе. Ничего страшного; приступим. Введём имя самой команды, затем начнём набирать начало абсолютного пути: mpg321 /do

Стоп! Вот прямо сейчас найдите клавишу табуляции и нажмите её. Видите, что произошло? /do автоматически дополнилось до /dos- . Командный интерпретатор понял (по характерному синтаксису ссылки), что мы собираемся вводить имя одного из каталогов верхнего уровня; заглянул туда и увидел, что с "do" там начинаются только /dos-c т /dos-d. Не зная, что именно нам потребуется, он сам дописал нам в строчку совершенно точно нужные литеры и остановился, ожидая дальнейших указаний. Курсор снова активен.


Мы можем побудить интерпретатор продемонстрировать, какие есть варианты выбора, нажав табуляцию ещё раз. Он покажет: /dos-c и /dos-d. Нам остается ввести нужную букву и снова нажать табуляцию. Командный интерпретатор пририсует к имени каталога косую черту и снова остановится - ведь поддиректорий там много, и он не знает, что нам требуется. Нажмём на табуляцию! Нам опять продемонстрируют все доступные варианты. Наша цель - директория musics, очевидно. На m начинается название только у неё, поэтому достаточно нажать именно эту букву, и следом за ней клавишу табуляции - прописанный путь дополнится именем директории. Снова двойное нажатие на табуляцию, переход на следующий уровень... И так далее.


В итоге, в качестве аргумента утилиты mpg321 мы при помощи функции автодополнения сможем указать даже такое имя файла (с пробелами в названии), которое наверняка затруднились бы набрать вручную. А теперь заодно и получили информацию о том, как это делается: символ обратной косой черты (backslash, \) "экранирует" следующий за ним символ пробела и помогает командному интерпретатору понять, что данный пробел не разделяет, допустим, аргументы или параметры в команде, а является составной частью наименования файла.


Вот, собственно говоря, и всё на сегодня. Наслаждаемся музыкой. Но как же быть, если звуковой файл у вас так и не зазвучал, или Windows-раздел не подмонтировался при старте системы? Самое главное - не отчаиваться. Пройдёт всего неделя, и мы займёмся вопросом анализа и устранения такого рода неполадок. А пока почитайте страницы руководств ставших известными вам команд, попробуйте поискать новые при помощи apropos. Linux вознаграждает пытливых!