Введение в Unix
Лабораторный практикум

ОСНОВНОЕ ПРАВИЛО РАБОТЫ В КЛАССЕ

Запрещается трогать кнопки на системном блоке компьютера.

Принятые обозначения

Нотация команд:

Команды в тексте выделяются курсивом, имена файлов и каталогов - жирным шрифтом.

Значки:

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

1. Изучение файловой системы

Войдите в систему в режиме командной строки, используя имя root и пароль redhat. Система должна вывеси приглашение командной строки (значок доллара, процента или тому подобное).

1.1. Получение справки

Команда

%man файл

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

При упоминании какой-либо команды, функции или системного файла в литературе по Unix часто в скобках указывается номер раздела справочника man, например: "команда ls(1) предназначена для вывода списка файлов". Как правило man сам находит раздел с требуемой справкой, просматривая все разделы по очереди, поэтому для получения справки по команде ls достаточно ввести

%man ls

Управление скролингом текста:

Однако иногда требуемый термин может находиться сразу в нескольких разделах (printf - команда и библиотечная функция); в этом случае man выдаст документ из первого найденного раздела. Для получения документа из другого раздела используется ключ -s раздел. Для получения списка разделов, в которых встречается требуемый термин используется ключ -l. Ключ -a дает указание вывести все найденные справки из всех разделов друг за другом.

Обращайте внимание на номера разделов (они указываются в заголовке каждой страницы).
%man printf
%man -S 3 printf
%man 3 printf 
%man -a printf

1.2. Изучение файловой системы

Команда

%pwd
выводит полное имя текущего каталога (в котором вы находитесь).

Команда

%ls
выводит список файлов текущего каталога.

%ls -l
выводит список файлов с их атрибутами, например:
-rwxr-xr--   1 vm97     students   24380 Feb  3  2000 hello
ABBBBBBBBB   C DDDD     EEEEEEEE   FFFFF GGGGGGGGGGGG HHHHH - см. ниже описание полей листинга

A. Тип файла

-
обычный файл;

d
каталог (фактически, каталог - это специальный файл, в котором перечислены файлы этого каталога);

l
символическая связь (файл, содержащий имя другого файла - является сылкой на этот файл; подробности ниже в команде ln);

c
символьное устройство (устройство, с которым операции чтения-записи производятся побайтно);

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

p
конвейер (pipe; программный канал, организованный в виде очереди, для передачи данных между двумя процессами).


B. Права на использование файла

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

для обычных файлов:

для каталогов:

Набор прав --x для каталога позволяет войти в него и прочитать файл, имя которого заранее известно (при условии наличия прав чтения этого файла). Можно также выполнить команды ls и ls -l для этого файла. При этом получить список файлов (ls (-l) для каталога), а также создать или удалить файл нельзя.

Право r-- для каталога позволяет произвести чтение каталога, то есть получить список имен его файлов. При этом ни войти в каталог, ни узнать атрибуты файлов (ls -l), ни прочесть файл (даже при наличии прав чтения этого файла) нельзя. Создать или удалить файл, естественно, нельзя.

Что означают права -wx для каталога? Где это может применяться?



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

С. Число связей

Число жестких связей (имён) файла - подробнее см. ниже команду ln. Для каталога - число его подкаталогов (как минимум два - '.' точка и '..' две точки).

D. Пользователь-владелец файла

E. Группа-владелец файла

Группа - это именованное множество пользователей; группы составляются администратором. Каждый пользователь является членом как минимум одной группы.

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

F. Размер файла в байтах

G. Дата последней модификации файла

H. Имя файла

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

%ls -al
(обратите внимание на наличие символической связи)

Шелл bash для выполнения начальных установок пользователя в некоторых случаях читает файл .profile, а в некоторых - .bashrc. Создание символической связи повзоляет не создавать два одинаковых файла.

%ls b.txt
%ls -l b.txt
%ls prog
%ls -l prog

Проблема: как вывести атрибуты самого каталога, а не его содержимого. Возможные решения: ls -l (строка файла prog) и ls -al prog (строка файла '.') неудовлетворительны при большом числе файлов в текущем каталоге и в каталоге prog - получится слишком длинный листинг. Решение:

%ls -d prog
%ls -ld prog

%ls -ld .
%ls -l ..
%ls -ld ..


Команда

%cd каталог
- переход в указанный каталог. Без указания каталога - переход в домашний.

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

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

%pwd
%cd local
/usr/local/bin
%pwd
%cd ..
%pwd
%cd /usr
%pwd
%cd
%pwd

1.3. Изучение содержимого файла

Команда

%file имя_файла [имя_файла ...]
определяет тип файла путем анализа его содержимого

Определите тип всех файлов вашего домашнего каталога и каталога /usr/local/bin.

Расширение файла (часть имени после точки) в Unix не имеет никакого специального значения. Например, для запуска файла требуется не расширение типа .exe, а право на исполнение.

Команда

%cat имя_файла
- выводит содержимое файла на терминал.

%cat b.txt

Команды

%lessимя_файла
%more имя_файла
- пейджер (выводит файл постранично, с остановом). Фактически, команда man формирует текст справки и пропускает его через more. Поэтому команды управления прокруткой текста см. выше в описании man.

%more b.txt

Команда

%tail [-число] имя_файла
выводит последние 10 строк файла или сколько указано.

%tail b.txt
%tail -2 b.txt

Команда

%head [-число] имя_файла
выводит первые 10 строк файла или сколько указано.

%head b.txt
%head -2 b.txt

Команда

%od имя_файла
выводит файл в восьмеричном виде. Ключи:

%od -N10 tx b.txt

1.4. Манипулирование файлами

Создание файла

Команда

%touch имя_файла
изменяет время последней модификации файла на текущее. Побочный эффект: если файла нет, он создается с нулевым размером.

%>имя_файла
создает файл нулевого размера (буквально: в этот файл перенаправляется вывод из ниоткуда).

%touch a
%>b
%ls -l

Создание каталога

%mkdir dir
%ls -l

Копирование файла в другой файл или каталог

%cp файл-источник файл-или-каталог-приемник
Если файл приемник существует, он будет удален (т.е. копирование производится поверх). Каталог-приемник должен существовать.

%cp b.txt z
%ls -l

UNIX расчитана на профессиональных пользователей. Предупреждений по поводу удаления файлов не выводится.

Рекурсивное копирование каталога в другой каталог

%cp -R каталог-источник каталог-приемник

%cp -R bin dir
%ls -l 
%ls -l dir

Перемещение/переименование файла или каталога

%mv файл-или-каталог-источник файл-или-каталог-приемник

%mv z y
%ls
%mv y dir
%ls 
%ls dir
%mv dir ddd
%ls 
%ls ddd

Символические связи

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

Создание символической связи:

%ln -s сущетсвующий_файл файл_связь
(Файл с именем файл_связь не должен существовать.)

%ln -s b.txt c.txt
%ls -l
(внимание на файл c.txt и его размер: 5 - это число символов в имени "b.txt")
%more c.txt

Жесткие связи

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

Создание жесткой связи - это создание еще одного имени, ссылающегося на тот же самый индексный дескриптор:

%ln сущетсвующее_имя_файла новое_имя_файла

%ln b.txt d.txt
%ls -l
(внимание на значение второй колонки для b.txt и d.txt и размер этих файлов, заметьте также время последней модификации)
Файлы b.txt и d.txt абсолютно равноправны, т.к. это два разных имени одного и того же физического файла.

%touch d.txt
%ls -l b.txt d.txt
(внимание на время последней модификации у обоих файлов)
%ls -i b.txt d.txt
(выводит номера индексных дескрипторов - видим, что это один и тот же файл)

Удаление файлов и каталогов

%rm имя_файла
- удаляет файл, но не каталог;
%rmdir имя_каталога
- удаляет каталог, только если он пуст;
%rm -r имя_каталога
- удаляет каталог рекурсивно (т.е. со всеми подкаталогами), но просит подтверждения при удалении файлов, в которые у вас нет права записи (поскольку для удаления файла достаточно иметь право записи в его каталог);
%rm -rf имя_каталога
- удаляет каталог рекурсивно и молча.

%ls ddd
%rm ddd/y
%ls ddd
%rm ddd
%rmdir ddd
%rm -r ddd
%ls -l 
%rm c.txt
%ls -l b.txt d.txt
%rm d.txt
%rm a b 
%ls -l

Удаление файла на самом деле представляет собой уменьшение на 1 счетчика его имен в индексном дескрипторе; соответствующий системный вызов называется unlink(2). Физически файл удаляется системой если он закрыт и если счетчик имен равен нулю. Это свойство используется программистами при создании временных файлов: после создания файла функцией open сразу же вызывается unlink, сбрасывающий счетчик имен в 0. Пока файл открыт, его можно использовать (через файловую переменную, возвращенную функцией open; имени у файла уже нет). После вызова close файл автоматически уничтожается.

1.5. Что представляют собой команды UNIX?

Большинство команд представляют собой программы, находящиеся в каталоге /usr/bin. Чтобы выяснить, что понимает шелл под той или иной командой, используйте команду type. Шелл либо укажет путь к исполняемому файлу, либо сообщит, что это - его встроенная команда.

%type ls
%type rm
%type cd
%type type

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

%which ls
%which qwerty
(можете увидеть, что содержится у вас в PATH)
%which ls

Оказывается, существует программа /bin/ls, но шелл интерпретирует ls как свою встроенную в алиас команду. Дело в том, что все вышесказанное относится к случаю, когда вы вводите команду просто по имени. Если же вы вводите путь к исполняемому файлу (полный или относительный), то шелл никак не интерпретирует имя программы, а запускает конкретный указанный вами файл. То есть

%/bin/ls
запустит именно этот файл, а не встроенную в алиас команду. Впрочем, делают они почти одно и то же.

Завершите сеанс работы
%exit