Книга • о чем эта книга • Как возникла эта книга



Pdf просмотр
страница6/6
Дата11.11.2016
Размер4.9 Kb.
Просмотров1291
Скачиваний0
1   2   3   4   5   6
, пользователь может дать команду
[user]$ patch program.c program.c.diff > program.c.new в результате выполнения которой он получит файл program.c.new.
4.7. Команды архивирования фай лов
При работе с Linux вы, может быть, еще не скоро встретитесь с необходимостью работать с большинством консольных команд, поскольку имеются такие оболочки, как Midnight Commander или графические оболочки типа KDE. Но с командами архивирования (точнее, разархивирования) вам работать придется обязательно, хотя бы потому, что вы будете часто встречать архивированные файлы в Интернете.
Основным средством архивирования в UNIX (а, следовательно, и в Linux) является комплекс из двух программ — tar и gzip
. Хотя никто не запрещает пользоваться arj
,
pkzip, lha, rar и т. д. — версии этих программ для Linux общедоступны. Просто уж исторически сложилось, что пользователи Unix чаще применяют именно tar и gzip
, и именно в таком формате распространяется большая часть программного обеспечения для Unix. Поэтому овладеть работой с tar и gzip
— дело чести любого пользователя Linux.

4.7.1. Программа tar
У читателя, привыкшего к архиваторам типа arj, которые собирают файлы в единый архив и сразу "сжимают" их, может возникнуть вопрос "А зачем использовать две программы?” Все дело в том, что tar расшифровывается как Tape ARchiver, он не сжимает данные, а лишь объединяет их в единый файл с последовательным доступом для последующей записи на ленту. По умолчанию этот архивный файл создается на ленточном накопителе, точнее на устройстве
/dev/rmt0. Если вы хотите создать архивный файл на диске, то необходимо использовать команду tar с опцией f, после которой указывается имя архивного файла.
У программы tar имеется 8 опций, отличающихся от остальных тем, что при вызове программы должна обязательно задаваться одна из этих опций. Эти опции определяют основные функции программы.
Табл ица 4.5. Основные опции програм мы tar
Опция
Значение
-A
, --catenate, --concatenate Добавляет файлы в существующий архив
-c
, --create
Создает новый архив
-d
, --diff, --compare
Найти различия между архивом и файловой системой
--delete
Удалить из архива (не может использоваться с магнитной лентой!)
-r
, --append
Дописывает файлы в конец архива
-t
, --list
Выводит список файлов архива
-u
, --update
Добавляет только файлы, которые новее, чем имеющаяся в архиве копия
-x
, --extract, --get
Извлечь файлы из архива
Если вы работаете с файлами архивов на дисках, а не с ленточным устройством, то, очевидно, обязательной будет и опция f. Другие опции не являются обязательными, они служат только для конкретизации задания программе. Например, опция v заставляет программу выводить список обрабатываемых файлов.
Однобуквенные опции программы tar могут перечисляться друг за другом (вы увидите это в приводимых ниже примерах).
Я не буду давать здесь описание всех опций команды tar
, просто приведу несколько командных строк для выполнения самых необходимых действий с архивами.
Чтобы создать один tar­архив из нескольких файлов, используется команда:
[user]$ tar -cf
_
1 2 ...,
имя архива файл файл где опция ­c сообщает программе, что необходимо создать (create) архив, а опция f говорит о том, что архив должен создаваться в виде файла (имя которого должно следовать сразу за этой опцией).

В именах файлов, которые сохраняются в архиве, можно использовать шаблоны имен файлов, в том числе просто символы­заместители
*
и
?
. Благодаря этому можно очень короткой командой отправить в архив сразу много файлов. Например, для того, чтобы создать архив, содержащий все файлы одного из подкаталогов (пусть это будет sub_dir) текущего каталога, достаточно дать команду
[user]$ tar -cvf
_
./sub_dir/*
имя архива или даже просто
[user]$ tar -cvf
_
sub_dir имя архива
По этой команде в архиве будут сохранены не только файлы, расположенные непосредственно в подкаталоге sub_dir, но и рекурсивно все файлы из подкаталогов каталога sub_dir. При этом в архиве сохраняется вся структура подкаталогов каталога sub_dir.
Заметим, что если в только что приведенном примере вместо
*
поставить
*.*
, то будут сохранены только те файлы, которые расположены непосредственно в подкаталоге sub_dir, а подкаталоги каталога sub_dir архивированы не будут (
Примеч.12
). Если в том же примере не указать имя подкаталога, то будут архивироваться все файлы (и подкаталоги) текущего каталога. Но если вы дадите команду следующего вида
[user]$ tar -cvf
_
./.*
имя архива то в архиве будут сохранены не только все файлы (и подкаталоги) текущего каталога, но и файлы из родительского каталога, а хотели ли вы этого?
Теперь вы знаете как создать архив, а для того, чтобы распаковать (извлечь) файлы из архива, нужно дать команду:
[user]$ tar -xvf
_
имя архива файлы
Получить список файлов архива можно командой:
[user]$ tar -tf
_
| less имя архива
Программа tar является удобным средством для создания резервных копий файлов. Конечно, существуют специальные утилиты резервного архивирования, но даже если вы о них еще не знаете, то по меньшей мере, вы можете сделать следующее:
[user]$ tar -Mcvf /dev/fd0H1440 /каталог
Такая команда создаст на дискетах архив с содержимым каталога, разбивая его на тома.
Монтировать дискеты перед запуском команды не нужно, программа просто пишет на устройство потоком (в данном случае на дискету по секторам). При этом никакой файловой системы на дискете не создается. После заполнения дискеты вам будет выдан запрос на смену дискеты. Только, прежде чем запускать такую команду на выполнение, приготовьте достаточное число свободных дискет (помните, что tar не сжимает файлы), которые лучше всего соответствующим образом пометить и обязательно пронумеровать. Кроме того, имейте в виду, что вся информация на дискетах будет молча уничтожена.

Чтобы восстановить сохраненные данные, воспользуйтесь командой:
[user]$ tar -Mxpvf /dev/fd0H1440
Если вы ошибетесь в порядке вставляемых дискет, программы сообщит вам об этом и попросит заменить том.
В заключение раздела заметим, что всегда можно получить подсказку по использованию программы tar
, дав команду
[user]$ tar -help
При этом, если вы используете русифицированный дистрибутив Linux, например, Black Cat 6.02, то подсказка будет выдаваться по­русски.
4.7.2. Программа gzip
Хотя программа tar создает архивы, она, как было сказано, не сжимает архивы, а просто соединяет отдельные файлы в единый архивный файл. Для сжатия этого файла часто применяют команду gzip
. В простейшем случае она вызывается в следующем формате:
[user]$ gzip файл
В командной строке можно указать сразу несколько имен файлов или шаблон имени файла. Но в этом случае каждый из указанных файлов будет заархивирован отдельно (общий архив не создается).
Для того, чтобы распаковать архив, используйте команду
[user]$ gzip -d
_
файл архива или
[user]$ gunzip
_
файл архива
Исходные файлы после сжатия удаляются, остается только архивный файл (файлы перемещаются в архив), а при разархивации удаляется архив.
Перечислим кратко другие полезные опции программы gzip
Табл ица 4.6. Основные опции програм мы gzip
Опция
Значение
-h
, --help
Вызов краткой помощи по использованию программы
-l
, --list
Выдает имя файла, содержащегося в архиве, его объем и степень сжатия
-L
, --license
Отображает номер версии и лицензию на программу
-N
, --name
Сохранять (или восстанавливать) исходное имя и время создания файла

-n
, --no-name
Не сохранять (не восстанавливать) исходное имя и время создания файла
-q
, --quiet
Подавляет выдачу на экран предупреждающих сообщений
-r
, -- recursive
Рекурсивно обрабатывать подкаталоги (используется в случае. когда задан шаблон имен обрабатываемых файлов)
-S .suf
,
--suffix
.suf
Добавить суффикс .suf к имени сжатого файла (вместо добавляемого по умолчанию суффикса gz; но учтите, что при разархивации файлов с суффиксами, отличными от gz, программа вас не поймет)
-t
, --test
Протестировать архивный файл
-v
, --verbose
Выдача дополнительных сообщений в процессе работы программы
-V
, --version
Отобразить версию программы
-1
, --fast
Быстрое сжатие
-9
, --best
Более высокая степень сжатия
Поскольку программа gzip не умеет сохранять в одном архиве несколько файлов, то обычно ее применяют для сжатия архивов, созданных программой tar
. Более того, среди опций программы tar имеется специальная опция ­z, позволяющая сразу после создания сжать его с помощью программы gzip
. Для выполнения такого сжатия надо использовать команду tar примерно следующим образом:
[user]$ tar -czf
_
_
_
(
_
)
имя архива шаблон имен файлов или имя каталога
Только имейте в виду, что в этом случае суффикс .gz не добавляется автоматически к имени создаваемого архива, поэтому лучше сразу задать имя архива с указанием обеих суффиксов: имя.tar.gz.
4.7.3. Программа bzip2
В последнее время все чаще вместо программы gzip используется архиватор bzip2
, который обеспечивает более высокую степень сжатия и работает несколько быстрее. Команда bzip2 обычно не устанавливается автоматически при инсталляции Linux. Но она имеется на дистрибутивном диске в виде rpm­пакета и ее легко установить. (Как это сделать, см. в гл. 10.)
Работает bzip2
примерно так же, как команда gzip
, т. е. замещает каждый файл, имя которого задано в командной строке, сжатой версией, добавляя к имени файла суффикс .bz2.
Сжатый файл имеет то же самое время модификации, права доступа и, по возможности, того же владельца, что и исходный файл, что дает возможность восстановить эти атрибуты при извлечении файлов из архива.
В некоторых случаях сжатый файл может оказаться даже больше по размеру, чем исходный. Это
происходит, например, для файлов длиной менее 100 байт, потому что механизм сжатия использует заголовок длиной около 50 байт. Для файлов, представляющих собой случайную последовательность символов (в том числе для выходных файлов большинства файловых архиваторов) длина файла увеличивается примерно на 0.5%.
Команда bunzip2
(или bzip2 -d
) разархивирует указанные в командной строке файлы. Если эти файлы не были созданы программой bzip2
, они не будут разархивироваться, будет выдано соответствующее предупреждение. При разархивации bzip2
пытается угадать имя разархивируемого файла по следующим правилам:

filename.bz2 заменяется на filename;

filename.bz заменяется на filename;

filename.tbz2 заменяется на filename.tar;

filename.tbz заменяется на filename.tar;

любое другое "имя" заменяется на "имя.out".
Опции командной строки для bzip2
очень похожи на опции команды gzip
, но все же они не идентичны. Приведу краткую сводку наиболее необходимых в работе опций.
Табл ица 4.7. Основные опции програм мы bzip2
Опция
Значение
-d
, -- decompress
Принудительная разархивация. Эта опция необходима в силу того, что bzip2, bunzip2 и bzcat — это на самом деле одна и та же программа, которая сама по расширению имени файла принимает решение о том, какое действие надо выполнить над указанным файлом. Опция -d отключает этот механизм и заставляет программу разархивировать указанные файлы
-z
, --compress Принудительная архивация
-t
, --test
Проверка целостности указанного файла(ов) без разархивации
-f
, --force
Перезапись существующего файла. По умолчанию bzip2 не перезаписывает существующие файлы. Если вы хотите перезаписать существующий файл, надо задать опцию -f
-k
, --keep
Сохранять (не удалять) исходные файлы при архивации или разархивации
-s
, --small
Снижает требования к объему используемой оперативной памяти за счет снижения скорости архивации. Эту опцию рекомендуется применять на компьютерах с малым объемом ОЗУ (8 Мбайт и меньше)
-q
, --quiet
Не выводить малосущественные сообщения
-v
, --verbose Выводить дополнительную информацию в процессе работе (представляет интерес в диагностических целях)
-L
, --license,
-V
, --version
Отобразить версию программы и лицензионное соглашение
Аргументы командной строки, которым предшествует двойное тире и пробел, трактуются как имена файлов, даже если они начинаются с тире. Например,
[user]$ bzip2 -- -myfilename

Я думаю, что приведенных данных достаточно для квалифицированного применения архиваторов tar
, gzip и bzip2
. За дополнительными сведениями, как всегда, обращайтесь к интерактивной подсказке man. По утилите bzip2
имеется "Bzip2­HOWTO”, который даже переведен на русский язык
[П6.4]
4.8. Создание и монтирование фай ловы х систем
В предыдущих разделах мы кратко рассмотрели основные команды для работы с уже сформированной файловой системой. Теперь надо остановиться на вопросе о том, как создать файловую систему и модифицировать ее.
Общее дерево файлов и каталогов системы Linux формируется из отдельных "ветвей", соответствующих различным физическим носителям. Часто говорят, что оно формируется из отдельных файловых систем. Говорить так позволяет тот факт, что в UNIX нет понятия "форматирования диска" (и команды форматирования), а используется понятие "создание файловой системы". Когда мы получаем новый носитель, например, жесткий диск, мы должны создать на нем файловую систему. То есть каждому носителю ставится в соответствие отдельная файловая система. Чтобы эту файловую систему использовать для записи в нее файлов, надо ее вначале подключить в общее дерево каталогов ("смонтировать"). Вот и получается, что можно говорить о монтировании файловых систем или о монтировании носителей (с созданными на них файловыми системами).
Можно еще в виде предисловия отметить, что обычно жесткий диск предварительно разбивается на разделы (особенно современные диски, имеющие емкость, исчисляемую десятками гигабайт).
Создание разделов облегчает выполнение резервного копирования, решение задач разграничения полномочий, повышает производительность и ограничивает потенциальный ущерб, наносимый вышедшими из­под контроля программами. Поэтому в дальнейшем будем говорить о создании файловой структуры в одном разделе (диск, не имеющий разделов, можно тоже рассматривать как один раздел).
Еще один момент, существенный в контексте этого раздела, связан с тем, что Linux может работать с разными типами файловых систем. "Родной" файловой системой для него в настоящее время является "вторая расширенная файловая система" (second extended filesystem) ext2fs. Ho в
Linux можно работать и с 16­разрядной файловой системой FAT, создаваемой в MS­DOS, и с 32­
разрядной FAT32, разработанной для MS Windows 95, и с файловой системой ISO9660, используемой для записи информации на CD­ROM, и с другими типами файловых систем (в число которых пока, правда, не входит NFTS). То есть, при рассмотрении вопросов создания и монтирования файловых систем надо постоянно помнить о том, что типы файловых систем на разных носителях могут различаться.
Итак, вначале рассмотрим случай, когда требуется создать в каком­то разделе диска файловую систему. Будем предполагать, что создается файловая система типа ext2fs (создание файловых систем других типов — тема для книг, посвященных другим операционным системам). Создание файловой системы типа ext2fs подразумевает создание в данном разделе на диске суперблока,
таблицы индексных дескрипторов и совокупности блоков данных. Делается все это все с помощью команды mkfs
. В простейшем случае достаточно дать эту команду в следующем формате:
[root]# mkfs -t ext2 /dev/hda5,
где /dev/hda5 надо, естественно, заменить указанием на соответствующее устройство или раздел.
Например, если вы хотите создать файловую систему на дискете, то команда примет вид:
[root]# mkfs -t ext2 /dev/fd0
(Можно сказать, что мы "отформатировали дискету", но учтите, что в DOS или Windows такие дискеты не читаются. Для создания под Linux дискет, которые бы читались в DOS или Windows, служат специальные утилиты.)
После выполнения команды mkfs в указанном разделе будет создана файловая система ext2fs
(еще раз повторю, что подробнее об этом вы узнаете в гл. 16). В новой файловой системе автоматически создается один каталог с именем lost+found. Он используется в экстренных случаях программой fsck
, поэтому не удаляйте его. Для того, чтобы начать работать с новой файловой системой (например, переписать какие­то файлы на новый носитель), необходимо подключить ее в общее дерево каталогов, что делается с помощью команды mount
В качестве параметров команде mount надо, как минимум, указать устройство и "точку монтирования". Точкой монтирования называется тот каталог в уже существующем и известном системе дереве каталогов, который будет теперь служить корневым каталогом для подключаемой файловой системы. Пример: команда
[root]# mount /dev/hdb1 /mnt/disk2
подсоединяет файловую систему первого раздела на втором жестком диске к каталогу /mnt/disk2
(этот каталог должен существовать!).
Отметим, что после монтирования файловой системы в каталог /mnt/disk2 прежнее содержимое этого каталога станет для вас недоступно (так же, как информация о прежнем владельце и правах доступа к этому каталогу) до тех пор, пока вы не размонтируете вновь подключенную файловую систему. Прежнее содержимое не уничтожается, а просто становится временно недоступным. Поэтому в качестве точек монтирования лучше использовать пустые каталоги
(заранее заготовленные).
В той простейшей форме, которую мы использовали в приведенном выше примере, команда mount будет работать только при условии, что все недостающие ей для выполнения параметры она найдет в файле /etc/fstab. Если же такого файла не существует, или он не содержит необходимых данных, надо применять более полную форму команды mount
:
[root]# mount -t type device path где type задает тип файловой системы, device указывает, на каком устройстве (в каком разделе) она находится, а path задает точку монтирования.

Конфигурационный файл /etc/fstab используется в основном для того, чтобы обеспечить автоматическое монтирование файловых систем в процессе загрузки. Каждая строка этого файла содержит описание одной файловой системы и состоит из 6 полей, разделяемых пробелами (для удобочитаемости поля обычно выравнивают, но делать это не обязательно):

имя устройства. В качестве имени может использоваться как имя локального устройства, например, /dev/hda5, так и путевое имя сетевой файловой системы NFS, например, pc21:/home/jim, что указывает на каталог /home/jim на машине с именем pc21;

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

тип файловой системы;

опции монтирования (по умолчанию подразумевается rw — чтение, запись);

уровень дампа. Это поле используется программой dump
, предназначенной для создания резервных копий. Если файловая система должна участвовать в процессе резервного копирования, то здесь должно стоять число 1, если нет — 0. Возможны и другие значения
(см. руководство к программе dump)
;

порядок (приоритет) проверки файловых систем программой fsck
. Системы с меньшими значениями этого поля проверяются раньше. Системы с одинаковыми номерами проверяются, если это возможно, параллельно.
В настоящее время Linux поддерживает следующие типы файловых систем (см. страницу man fs, где дано их краткое описание): minix, ext, ext2, xia, msdos, umsdos, vfat, proc, nfs, iso9660, hpfs, sysv, smb, ncpfs. Вместо типа файловой системы в поле "тип файловой системы" (и в опции ­t команды mount
) можно задать значение auto. В таком случае команда mount попытается самостоятельно определить тип монтируемой файловой системы. Однако это во многих случаях приводит к ошибкам, поэтому лучше указать тип явно. Можно перечислить несколько типов
(через запятую). В команде mount можно также вначале задать список типов файловых систем, которые не надо монтировать. Этот список задается с помощью флага no
. Такая возможность может оказаться полезной в том случае, когда используется команда mount с аргументом ­
a
. По этой команде производится монтирование всех файловых систем, перечисленных в файле
/etc/fstab. С помощью дополнительного аргумента
-t type в этом случае можно ограничиться монтированием файловых систем только определенного типа, а с помощью флага no можно указать типы, которые не надо монтировать. Например, команда
[root]# mount -a -t nomsdos,ext монтирует все файловые системы, за исключением тех, которые относятся к типам msdos и ext.
Когда монтируется файловая система, упомянутая в файле /etc/fstab, то в команде монтирования достаточно указать только один аргумент — либо имя устройства, либо точку монтирования. Все остальные параметры команда mount возьмет из файла /etc/fstab.
Обычно монтировать файловые системы может только суперпользователь, но если в поле опций монтирования файла /etc/fstab указать опцию user, то соответствующую файловую систему
смогут смонтировать все пользователи. Так, если в /etc/fstab имеется строка
/dev/cdrom /cd iso9660 ro,user,noauto,unhide,
то любой пользователь сможет смонтировать файловую систему на своем CDROM, используя команду
[user]$ mount /dev/cdrom или
[user]$ mount /cd
В табл. 4.8 приведены еще некоторые опции, которые могут использоваться в команде mount и в файле /etc/fstab.
Табл ица 4.8. Основные опции команды mount
Опция
Значение async
Весь ввод­вывод в файловую систему должен производиться асинхронно auto
Файловая система может монтироваться командой mount c опцией -a defaults
Использовать набор опций, задаваемый по умолчанию: rw, suid, dev, exec, auto, nouser, async dev
Файлы байт­ориентированных и блок­ориентированных устройств в файловой системе интерпретируются как специальные файлы noauto
Файловая система может монтироваться только явно. Опция ­a не приведет к монтированию файловой системы exec
Разрешает выполнение двоичных файлов remount
Позволяет перемонтировать уже смонтированную файловую систему. Обычно используется для изменения опций монтирования файловой системы, особенно для того, чтобы расширить права доступа (вместо прав только на чтение установить права на чтение/запись)
ro
Монтирует файловую систему только на чтение rw
Монтирует файловую систему для чтения и записи suid
Позволяет задействовать биты смены идентификатора пользователя и смены идентификатора группы sync
Весь ввод­вывод в файловую систему должен производиться синхронно user
Позволяет непривилегированному пользователю монтировать файловую систему. Для таких пользователей монтирование всегда выполняется с опциями noexec, nosuid, nodev nodev
Файлы байт­ориентированных и блок­ориентированных устройств в файловой системе не интерпретируются как специальные файлы nosuid
Не позволяет задействовать биты смены идентификатора пользователя и смены идентификатора группы nouser
Запрещает непривилегированному пользователю монтировать файловую систему

Команды mount и umount
(см. ниже) поддерживают в актуальном состоянии таблицу (или перечень) смонтированных файловых систем. Этот перечень сохраняется на диске в виде файла
/etc/mtab. Этот файл можно просмотреть непосредственно, или вывести на экран командой mount без аргументов.
Если вы хотите монтировать какую­то систему только для чтения из нее, то в соответствующей строке файла /etc/fstab надо либо указать опцию r (read only, по умолчанию подразумевается rw, т. е. и чтение, и запись), либо использовать команду mount с параметром ­r.
Перед тем как отключить от компьютера носитель, на котором расположена файловая система,
(чаще всего это требуется делать с дискетами в дисководе, но иногда и с носителями других типов), необходимо "размонтировать" файловую систему (другими словами, "размонтировать носитель"). Эта операция выполняется с помощью команды umount
(замечание для тех, кто знает английский язык: имя команды не является правильным английским словом, так что не вставляйте в него лишнюю букву "n"). В качестве аргумента команде umount надо дать либо имя устройства, либо точку монтирования.
Демонтировать файловую систему может только тот пользователь, который ее смонтировал (и суперпользователь, конечно). Для того, чтобы операцию демонтирования мог выполнить любой пользователь, в поле параметров соответствующей строки файла /etc/fstab надо указать опцию users (вместо user).
Демонтирование файловой системы возможно только тогда, когда в ней нет открытых файлов (в частности, не должно быть запущено программ, файлы которых расположены в данной системе) и в системе нет процессов, использующих эту файловую систему (т. е. демонтируемая файловая система не должна быть занятой).
Надо признать, что, в сравнении с DOS или Windows, работа с дискетами и другими сменными носителями (CD­ROM, Iomega Zip и т.п.) в ОС типа UNIX менее удобна. Для того, чтобы обратиться к дискете, вы должны вначале смонтировать ее в какой­то каталог в файловой структуре. А для смены дискеты требуется вначале размонтировать предыдущую дискету, а затем смонтировать новую. То же самое с другими сменными носителями. Поскольку с дискетами и другими сменными носителями так или иначе приходиться работать, лучше сразу заготовить в файловой структуре стандартные каталоги для монтирования всех имеющихся в вашем распоряжении типов сменных носителей. Например, создать каталог /mnt, а в нем подкаталоги floppy, cdrom, zip и т. д.
Пожалуй, это все, что нужно знать начинающему пользователю системы Linux о файловых системах. Еще раз повторю, что здесь была рассмотрена только одна сторона файловой системы ext2fs, обращенная к пользователям, т. е. в основном, логика построения структуры каталогов и файлов. Обратная сторона файловой системы, ее внутреннее устройство, а также различные типы файловых систем, в настоящем разделе только упоминались по мере необходимости. Всем этим вопросам будет посвящена гл. 16

Глава 5. Оболочка bash
Предыдущий раздел Оглавление Следующий раздел
В этой главе мы рассмотрим работу с системой Linux в текстовом режиме, другими словами, с консоли или терминала. Начинающему пользователю может казаться, что он никогда не будет работать в этом режиме, поскольку существует графический режим. Однако это мнение ошибочно, ибо многие действия оказывается быстрее и удобнее выполнять именно в текстовом режиме. Даже находясь в графическом режиме, вы часто будете открывать окно эмулятора терминала, и выполнять необходимые действия в этом окне. Ведь текстовый режим ОС Linux — это совсем не то, что текстовый режим однозадачной MS­DOS. Поскольку Linux — это многозадачная ОС, уже в текстовом режиме обеспечивается возможность работы в нескольких окнах (о переключении терминалов мы рассказали в разд. 3.3). А для редактирования простого текста или html­файла вовсе не обязательно запускать достаточно тяжеловесную и медленную
(особенно на "слабых" компьютерах) графическую оболочку.
5.1. Что такое оболочка?
Как уже упоминалось выше, хотя мы часто говорим, что "пользователь работает с операционной системой", фактически это не верно, поскольку на деле взаимодействие с пользователем организует специальная программа. Существует два вида таких программ — оболочка, или shell,
для работы в текстовом режиме (интерфейс командной строки) и графический интерфейс пользователя GUI (Graphical User Interface), организующий взаимодействие с пользователем в графическом режиме.
Сразу надо сказать, что в принципе любая программа в Linux может быть запущена как через оболочку (если запущен X­сервер, см. гл. 6), так и через графический интерфейс пользователя.
Запуск программ из оболочки эквивалентен (двойному) щелчку мышкой по иконке программы в
GUI. Передача аргументов программе в текстовом режиме аналогична тому, что мы "бросаем" что­то на иконку программы в графическом. Но, с другой стороны, некоторые программы не приспособлены для запуска через GUI и, соответственно, могут быть исполнены, только из командной строки.
Собственно говоря, название "оболочка" не выдерживает критики. На мой взгляд правильнее было бы называть эту программу командным процессором, как называют command.com в MS
DOS, или интерпретатором команд. Но так уж повелось во всех UNIX­системах, что интерпретатор команд для текстового режима называют оболочкой.
Когда­то (в первых UNIX­системах) это была программа с именем sh
, которое было сокращением от shell. Потом были разработаны несколько ее улучшенных вариантов, в частности, Bourne shell — расширенная версия sh
, написанная Стивом Борном (Steve Bourne). В рамках проекта GNU (проект Р.Столлмана по разработке свободного ПО, см. www.gnu.org) была создана оболочка bash
, название которой расшифровывается как Bourne­again shell, т. е.
"снова оболочка Борна". По­английски в этом названии просматривается еще и игра слов,
связанная с тем, что Bourne звучит как borne (рождаться, рожденный), и получается "заново рожденная shell". Оболочка bash была написана Брайеном Фоксом (Brian Fox — основной разработчик) и Четом Рэми (Chet Ramey). Именно bash мы и будем далее рассматривать, и всюду ниже, где говорится об оболочке вообще, вы смело можете считать, что речь идет о bash
.
Сама по себе оболочка bash не выполняет никаких прикладных задач. Но она обеспечивает выполнение всех приложений: нахождение вызываемых программ, их запуск и организацию ввода/вывода. Кроме того, оболочка отвечает за работу с переменными окружения и выполняет некоторые преобразования (подстановки) аргументов. Но главное свойство оболочки, которое делает ее мощным инструментом пользователя — это то, что она включает в себя простой язык программирования. Как давно доказано в математике, любой алгоритм можно построить из пары­
тройки основных операций и одного условного оператора. Реализацию условных операторов (а также операторов цикла) и берет на себя оболочка. Она использует все остальные утилиты и программы (и те, которые имеются в составе операционной системы, и те, что устанавливаются отдельно) как базовые операции поддерживаемого ею языка программирования, обеспечивает передачу им аргументов, а также передачу результатов их работы другим программам или пользователю. В результате получается очень мощный язык программирования. И в этом основная сила и одна из существенных функций оболочки.
Прежде чем читать дальше этот раздел, вернитесь ненадолго к разд.
3.4
и еще раз просмотрите основные комбинации клавиш, используемые для управления вводом в текстовом режиме.
Вспомните по крайней мере то, как пользоваться клавишами +, +, и клавишами со стрелками.
5.2. Специальные символы
Оболочка bash использует несколько символов из числа 256 символов набора ASCII в специальных целях, либо для обозначения некоторых операций, либо для преобразования выражений. В число таких символов входят символы:
`
! @ # $ % ^ & * ( ) _ — [ ] { } : ; ' " / \ > <
а также символ с кодом 0, символ возврата каретки (генерируемый клавишей ) и пробел.
В зависимости от ситуации эти специальные символы могут трактоваться либо в их специальном значении, либо в буквальном, т. е. как литералы. Но мы в основном будем предполагать, что все эти символы зарезервированы и не должны использоваться в качестве литералов. Это касается в первую очередь использования их в именах файлов и каталогов, о чем мы уже говорили в гл. 4.
Однако символы
_
,
- и . (знак подчеркивания, дефис и точка) часто используются в именах файлов, так что именно этот пример показывает, что специальное значение эти символы имеют не всегда. В именах файлов только символы точки (
) и слэша (
/
) имеют специальное значение.
Символ слэша служит для разделения имен отдельных каталогов, а точка имеет специальное значение только если она является первым символом в имени файла (что означает, что файл является «скрытым»).
Давать сейчас точное определение того, какое специальное значение и в каких ситуациях имеет
тот или иной специальный символ, нецелесообразно. Мы будем рассматривать их постепенно в следующих разделах, по мере того, как они потребуются. Однако есть три символа, которые имеют особое значение и которые поэтому необходимо рассмотреть в первую очередь.
Символ
\
(обратный слэш) можно назвать "символом отмены специального значения" для любого из специальных символов, который стоит сразу вслед за
\
. Например, если мы хотим использовать символ пробела в имени файла, мы должны вместо простого пробела поставить
\
Например, возможна следующая команда:
[user]$ cp two_words two\ words
Символы ' и " (одинарные и двойные кавычки) могут быть названы "символами цитирования".
Любой из этих символов всегда используется в паре с его копией для обрамления какого­то выражения, совсем как в обычной прямой речи. Если какой­то текст взят в одинарные кавычки, то все символы внутри этих кавычек воспринимаются как литералы, никаким из них не придается специального значения. Если вернуться к тому же примеру с пробелами в имени файла, то можно сказать, что для того, чтобы дать файлу имя "two words" надо взять имя в кавычки:
[user]$ cp two_words 'two words'
Различие в использовании символов '
и "
состоит в том, что внутри одинарных кавычек теряют специальное значение все символы, а внутри двойных кавычек — все специальные символы кроме
$
,
'
и
\
(знака доллара, одинарных кавычек и обратного слэша).
5.3. Выполнение команд
Как было отмечено выше, одна из основных функций оболочки состоит в том, чтобы организовать исполнение команд пользователя, вводимых им в командной строке. В частности, оболочка предоставляет пользователю два специальных оператора для организации задания команд в командной строке:
;
и
&
5.3.1 Оператор ;
Хотя чаще всего пользователь задает команды в командной строке по одной, имеется возможность задать в одной строке несколько команд, которые будут выполнены последовательно, одна за другой. Для этого используется специальный символ ­оператор
;
. Если не поставить этот разделитель команд, то последующая команда может быть воспринята как аргумент предыдущей. Таким образом, если написать в командной строке что­то вроде:
[user]$ command1 ; command2
то оболочка вначале запустит на выполнение команду command1
, дождется, пока ее выполнение завершится, после чего запустит command2
, дождется ее завершения, после чего снова выведет приглашение командной строки, ожидая следующих действий пользователя.

5.3.2 Оператор &
Оператор
&
используется для того, чтобы организовать исполнение команд в фоновом режиме.
Если поставить значок
&
после команды, то оболочка вернет управление пользователю сразу после запуска команды, не дожидаясь, пока выполнение команды завершится. Например, если задать в командной строке "
command1 & command2 &
", то оболочка запустит команду command1
, сразу же затем команду command2
, и затем немедленно вернет управление пользователю.
5.3.3 Операторы && и ||
Операторы
&&
и
||
являются управляющими операторами. Если в командной строке стоит command1 && command2
, то command2
выполняется в том, и только в том случае, если статус выхода из команды command1
равен нулю, что говорит об успешном ее завершении. Аналогично, если командная строка имеет вид command1
|| command2
, то команда command2
выполняется тогда, и только тогда, когда статус выхода из команды command1
отличен от нуля.
Сама техника организации запуска команд на выполнение не является предметом нашего рассмотрения. Можно только кратко сказать, что оболочка должна найти код команды, загрузить его в память, передать команде аргументы, заданные в командной строке, а после завершения выполнения соответствующего процесса передать каким­то образом пользователю или другому процессу результаты выполнения данной команды. Эти этапы мы кратко и рассмотрим.
Итак, первый этап — поиск кода команды. Команды бывают встроенные (те, код которых включен в код самой оболочки) и внешние (код которых расположен в отдельном файле на диске). Встроенную команду оболочка всегда найдет, а для поиска внешней команды пользователь, в принципе, должен указать оболочке полный путь до соответствующего файла.
Однако для облегчения жизни пользователей оболочка умеет искать внешние команды в каталогах, которые перечислены в специально заданных "путях поиска". Только если она не находит нужных файлов в таких каталогах, она решает, что пользователь ошибся при вводе имени команды. О том, как включить каталог в пути поиска, будет сказано ниже, а сейчас рассмотрим, как оболочка организует передачу данных исполняемой команде и выдачу результатов пользователю.
5.4. Стандартны й ввод/вы вод
5.4.1. Потоки ввода­вывода
Когда программа запускается на выполнение, в ее распоряжение предоставляются три потока
(или канала):

стандартный ввод (standard input или stdin). По этому каналу данные передаются программе;

стандартный вывод (standard output или stdout). По этому каналу программа выводит результаты своей работы;


стандартный поток сообщений об ошибках (standard error или stderr). По этому каналу программы выдают информацию об ошибках.
Из стандартного входа программа может только читать, а два других потока могут использоваться программой только для записи.
По умолчанию входной поток связан с клавиатурой, а выходной поток и поток сообщений об ошибках направлены на терминал пользователя. Другими словами, вся выходная информация запущенной пользователем команды или программы, а также все сообщения об ошибках, выводятся в окно терминала. Однако, как мы увидим чуть ниже, можно перенаправить выходные сообщения (например, в файл).
Для того, чтобы продемонстрировать, как работает стандартный поток ошибок, выполните команду ls с неверным аргументом, например, задав в качестве аргумента имя несуществующего файла. В таком случае ls выведет сообщение об ошибке в стандартный поток ошибок. Для нас, однако, в данном случае стандартный поток ошибок неотличим от выходного потока, поскольку сообщение об ошибке мы видим в окне терминала.
Работу со стандартными входным и выходным потоками лучше всего проиллюстрировать на примере команд echo и cat
5.4.2 Команда echo
Команда echo предназначена для выдачи на стандартный вывод строки символов, которая задана ей в качестве аргумента. После этого она выдает сигнал перевода строки и завершается.
Попробуйте выполнить команду
[user]$ echo ‘
,
!’
Привет дружище и, думаю, дальнейших пояснений не потребуется (только используйте именно одиночные кавычки, иначе результат может быть несколько иным).
5.4.3 Команда cat
Мы уже рассматривали кратко команду cat в предыдущем разделе. В данном разделе эта команда интересует нас в основном потому, что чаще всего она работает как раз с входным и выходным потоками. По умолчанию выход команды cat направляется в выходной поток. Чтобы убедиться, что эта команда по умолчанию воспринимает входной поток, запустите команду cat без аргументов. В результате курсор переместится в новую строку, и более как будто ничего не будет происходить. В это время команда ожидает поступления символов во входном потоке.
Введите любой символ, и вы увидите, что он сразу же появился на экране, что говорит о том, что программа сразу же направила его в выходной поток. Можно продолжить ввод символов, и они также появятся на экране.
Обычно клавиатура настроена на построчный ввод, поэтому если вы нажмете клавишу , последняя набранная строка передается команде cat
, которая вновь выводит данные на монитор
через стандартный вывод. Таким образом, каждая строка будет показана дважды: один раз при наборе и второй раз — командой cat
Если нажать комбинацию клавиш +, которая служит командой окончания процедуры ввода, вы вновь вернетесь к подсказке в командной строке. Можно также использовать комбинацию клавиш +, которая является в оболочке командой завершения работы запущенной программы.
Если команде cat в качестве аргумента задать имя файла, это будет означать, что содержимое файла будет направлено во входной поток, откуда его примет команда cat и выдаст в выходной поток. Но это только частный случай перенаправления ввода, очень полезного механизма оболочки, который, безусловно, заслуживает более подробного рассмотрения.
5.5. Перенаправление ввода/вы вода, каналы и фи льтры
Хотя обычно, как было сказано, ввод/вывод программы связаны со стандартными потоками, в оболочке существуют специальные средства для перенаправления ввода/вывода.
5.5.1 Операторы >, < и >>
Для обозначения перенаправления используются символы ">", "<" и ">>". Чаще всего используется перенаправление вывода команды в файл. Вот соответствующий пример:
[user]$ ls -l > /home/jim/dir.txt
По этой команде в файле /home/jim/dir.txt будет сохранен перечень файлов и подкаталогов того каталога, который был текущим на момент выполнения команды ls
; при этом если указанного файла не существовало, то он будет создан; если он существовал, то будет перезаписан; если же вы хотите, чтобы вывод команды был дописан в конец существующего файла, то надо вместо символа
>
использовать
>>
. При этом наличие пробелов до или после символов > или >> несущественно и служит только для удобства пользователя.
Вы можете направить вывод не только в файл, но и на вход другой команды или на устройство
(например, принтер). Так, для подсчета числа слов в файле /home/jim/report.txt можно использовать следующую команду:
[user]$ cat /home/jim/report.txt > wc -w а для вывода файла на печать — команду:
[user]$ cat /home/jim/report.txt > lpr
Как видите, оператор > служит для перенаправления выходного потока. По отношению к входному потоку аналогичную функцию выполняет оператор
<
. Приведенный выше пример команды для подсчета числа слов в определенном файле можно переписать следующим образом
(обратите внимание на отсутствие команды cat
):
[user]$ wc -w < /home/jim/report.txt

Этот вариант перенаправления часто используется в различных скриптах, применительно к тем командам, которые обычно воспринимают ввод (или ожидают ввода) с клавиатуры. В скрипте же, автоматизирующем какие­то рутинные операции, можно дать команде необходимую информацию из файла, в который заранее записано то, что нужно ввести для выполнения этой команды.
В силу того, что символы
<
,
>
и
>>
действуют на стандартные потоки, их можно использовать не только тем привычным образом, как это делается обычно, но и несколько по­другому. Так, следующие команды эквивалентны:
[user]$ cat > file
[user]$ cat>file
[user]$ >file cat
[user]$ > file cat
Однако сам по себе (без какой­либо команды, для которой определены стандартные потоки) символ перенаправления не может использоваться, так что нельзя, например, введя в командной строке
[user]$ file1 > file2
получить копию какого­то файла. Но это не уменьшает значения данного механизма, ведь стандартные потоки определены для любой команды. При этом перенаправить можно не только стандартный ввод и вывод, но и другие потоки. Для этого надо указать перед символом перенаправления номер перенаправляемого потока. Стандартный ввод stdin имеет номер 0, стандартный вывод stdout — номер 1, стандартный поток сообщений об ошибках stderr — номер
2. То есть полный формат команды перенаправления имеет вид (напомним, что пробелы возле > не обязательны): command N > M
где
N
и
M
— номера стандартных потоков (0,1,2) или имена файлов. Употребление в некоторых случаях символов
<
,
>
и
>>
без указания номера канала или имени файла возможно только потому, что вместо отсутствующего номера по умолчанию подставляется 1, т. е. стандартный вывод. Так, оператор
>
без указания номера интерпретируется как
1 >
Кроме простого перенаправления стандартных потоков существует еще возможность не просто перенаправить поток в тот или иной канал, а сделать копию содержимого стандартного потока.
Для этого служит специальный символ
&
, который ставится перед номером канала, на который перенаправляется поток: command N > &M
Такая команда означает, что выход канала с номером
N
направляется как на стандартный вывод, так и дублируется в канал с номером
M
. Например, для того, чтобы сообщения об ошибках дублировались на стандартный вывод, надо дать команду
2>&1,
в то время как
1>&2
дублирует stdout в stderr. Такая возможность особенно полезна при перенаправлении вывода в файл, так как мы тогда одновременно и видим сообщения на экране, и сохраняем их в файле.

5.5.2 Оператор |
Особым вариантом перенаправления вывода является организация программного канала (иногда называет трубопроводом или конвейером). Для этого две или несколько команд, таких, что вывод предыдущей служит вводом для следующей, соединяются (или разделяются, если вам это больше нравится) символом вертикальной черты — "|". При этом стандартный выходной поток команды, расположенной слева от символа
|
, направляется на стандартный ввод программы, расположенной справа от символа
|
. Например:
[user]$ cat myfile | grep Linux | wc -l
Эта строка означает, что вывод команды cat
, т. е. текст из файла myfile, будет направлен на вход команды grep
, которая выделит только строки, содержащие слово "Linux". Вывод команды grep будет, в свою очередь, направлен на вход команды wc -l
, которая подсчитает число таких строк.
Программные каналы используются для того, чтобы скомбинировать несколько маленьких программ, каждая из которых выполняет только определенные преобразования над своим входным потоком, для создания обобщенной команды, результатом которой будет какое­то более сложное преобразование.
Надо отметить, что оболочка одновременно вызывает на выполнение все команды, включенные в конвейер, запуская для каждой из команд отдельный экземпляр оболочки, так что как только первая программа начинает что­либо выдавать в свой выходной поток, следующая команда начинает его обрабатывать. Точно так же каждая следующая команда выполняет свою операцию, ожидая данных от предыдущей команды и выдавая свои результаты на вход последующей. Если вы хотите, чтобы какая­то команда полностью завершилась до начала выполнения последующей, вы можете использовать в одной строке как символ конвейера
|
, так и точку с запятой ;. Перед каждой точкой с запятой оболочка будет останавливаться и ожидать, пока завершится выполнение всех предыдущих команд, включенных в конвейер.
Статус выхода (логическое значение, возвращаемое после завершения работы программы) из канала совпадает со статусом выхода, возвращаемым последней командой конвейера. Перед первой командой конвейера можно поставить символ "!", тогда статус выхода из конвейера будет логическим отрицанием статуса выхода из последней команды. Оболочка ожидает завершения всех команд конвейера, прежде чем установить возвращаемое значение.
5.5.3 Фильтры
Последний из приведенных выше примеров (с командой grep
) можно использовать для иллюстрации еще одного важного понятия, а именно, программы­фильтра. Фильтры — это команды (или программы), которые воспринимают входной поток данных, производят над ним некоторые преобразования и выдают результат на стандартный вывод (откуда его можно перенаправить куда­то еще по желанию пользователя). К числу команд­фильтров относятся уже упоминавшиеся выше команды cat, more, less, wc, cmp, diff
, а также следующие команды.

Табл ица 5.1. Команды­фильтры
Команда
Кратк ое описание grep
, fgrep, egrep
Ищут во входном файле или данных со стандартного ввода строки, содержащие указанный шаблон, и выдают их на стандартный вывод tr
Заменяет во входном потоке все встречающиеся символы, перечисленные в заданном перечне, на соответствующие символы из второго заданного перечня comm
Сравнивает два файла по строкам и выдает на стандартный вывод 3 колонки: в одной — строки, которые встречаются только в 1 файле, во второй — строки, которые встречаются только во 2­ом файле: и в третьей — строки, имеющиеся в обоих файлах pr
Форматирует для печати текстовый файл или содержимое стандартного ввода sed
Строковый редактор, использующийся для выполнения некоторых преобразований над входным потоком данных
(берется из файла или со стандартного ввода)
Особым фильтром является команда tee
, которая "раздваивает" входной поток, с одной стороны направляя его на стандартный вывод, а с другой — в файл (имя которого вы должны задать).
Легко видеть, что по своему действию команда tee аналогична оператору перенаправления
1>&file
Возможности фильтров можно существенно расширить за счет использования регулярных выражений, позволяющих организовать, например, поиск по различным, зачастую очень сложным, шаблонам.
О перенаправлении и фильтрах можно было бы говорить очень много. Но этот материал имеется в большинстве книг по UNIX и Linux, например у Петерсена
[П1.4]
и Келли­Бутла
[П1.8]
Поэтому ограничимся сказанным, и перейдем к рассмотрению так называемой среды или окружения, создаваемого оболочкой.
5.6. Параметры и переменны е. Окружение оболочки
Понятие параметра в оболочке bash подобно понятию переменной в обычных языках программирования. Именем (или идентификатором) параметра может быть слово, состоящее из алфавитных символов, цифр и знаков подчеркивания (только первый символ этого слова не может быть цифрой), а также число или один из следующих специальных символов:
*
,
@
,
#
,
?
,
-
(дефис),
$
,
!
,
0
,
_
(подчеркивание).
Говорят, что параметр задан или установлен, если ему присвоено значение. Значением может быть и пустая строка. Чтобы вывести значение параметра, используют символ
$
перед его именем. Так, команда
[user]$ echo name выдаст на экран слово name
, а команда
[user]$ echo $name выдаст значение переменной name (если таковое, конечно, задано).

5.6.1 Разн овидности параметров
Параметры разделяются на три класса: позиционные парам ет ры, специальные парам ет ры
(именами которых как раз и служат перечисленные только что специальные символы) и переменные оболочки.
Имена (идентификаторы) позиционных парам ет ров состоят из одной или более цифр (только не из одиночного нуля). Значениями позиционных параметров являются аргументы, которые были заданы при запуске оболочки (первый аргумент является значением позиционного параметра 1, и т. д.). Изменить значение позиционного параметра можно с помощью встроенной команды set
Значения этих параметров изменяются также на время выполнения оболочкой одной из функций
(об этом будет рассказано ниже, в разд. 5.8).
Специальные парам ет ры являются шаблонами, замена (подстановка) которых производится следующим образом.
Табл ица 5.2. Специальные парам етры .
Парам етр
Прав ила з амены
*
Заменяется позиционными параметрами, начиная с первого. Если замена производится внутри двойных кавычек, то этот параметр заменяется на одно единственное слово, составленное из всех позиционных параметров, разделенных первым символом специальной переменной IFS (о ней будет сказано ниже). То есть
``$*'' эквивалентно ``$1c$2c...'', где c — первый символ в значении переменной IFS. Если IFS присвоено пустое значение или ее значение не установлено, параметры разделяются пробелами
@
Заменяется позиционными параметрами, начиная с первого. Если замена производится внутри двойных кавычек, то каждый параметр заменяется отдельным словом. Так, `` $@'' эквивалентно ''$1'' ''$2'' ... Если позиционных параметров нет, то значение не присваивается (параметр @ просто удаляется)
#
Заменяется десятичным значением числа позиционных параметров
?
Заменяется статусом выхода последнего из выполнявшихся на переднем плане программных каналов
-
(дефис)
Заменяется текущим набором значений флагов, установленных с помощью встроенной команды set или при запуске самой оболочки
$
Заменяется идентификатором процесса (PID) оболочки
!
Заменяется идентификатором процесса (PID) последней из выполняющихся фоновых (асинхронно выполнявшихся) команд
0
Заменяется именем оболочки или запускаемого скрипта. Если bash запускается для выполнения командного файла, $0 равно имени этого файла. В противном случае это значение равно полному пути к оболочке
_
(подчеркивание
)
Заменяется последним аргументом предыдущей из выполнявшихся команд (если это параметр или переменная, то подставляется ее значение)
Специальные параметры, перечисленные в приведенной выше таблице, отличаются тем, что на них можно только ссылаться; присваивать им значения нельзя.
Переменная с точки зрения оболочки — это параметр, обозначаемый именем. Значения
переменным присваиваются с помощью оператора следующего вида
[user]$ name=value где name
— имя переменной, а value
— присваиваемое ей значение (может быть пустой строкой).
Имя переменой может состоять только из цифр и букв и не может начинаться с цифры.
Значением может быть любой текст. Если значение содержит специальные символы, то его надо взять в кавычки. Присвоенное значение этих кавычек не содержит, естественно. Если переменная задана, то ее можно удалить, используя встроенную команду оболочки unset
Набор всех установленных переменных оболочки с присвоенными им значениями называется окружением (environment) или средой оболочки. Вы можете просмотреть его с помощью команды set без параметров (только, может быть, следует организовать конвейер "set | less"
). В выводе этой команды все переменные окружения перечисляются в алфавитном порядке. Для того чтобы просмотреть значение одной конкретной переменной, можно вместо команды set
(в выводе которой нужную переменную еще искать и искать) можно воспользоваться командой
[user]$ echo $name
(правда, в этом случае вы должны знать имя интересующей вас переменной).
Среди переменных, которые вы увидите в выводе команды set
, встречаются очень интересные переменные. Обратите, например, внимание на переменную RANDOM. Если вы несколько раз подряд выполните команду
[user]$ echo $RANDOM
вы каждый раз будете получать новое значение. Дело в том, что эта переменная возвращает случайное целое из интервала 0 — 32 768.
5.6.2 Приглаш ения оболочки
Одна из очень важных переменных имеет имя
PS1
. Эта переменная задает вид приглашения, которое bash выводит, когда ожидает ввода очередной команды пользователем. По умолчанию этой переменной присвоено значение "\s­\v\$ ". Вообще­то в bash существует четыре приглашения, которые используются в разных ситуациях. Переменная
PS1
задает вид строки приглашения, которая выдается тогда, когда оболочка ждет ввода команды. Вторичное приглашение, задаваемое переменной
PS2
, появляется тогда, когда оболочка ожидает от пользователя ввода еще каких­то данных, необходимых для продолжения работы запущенной команды или программы. По умолчанию переменная
PS2
имеет значение ">". Вы уже имели возможность видеть это приглашение, когда запускали команду cat для ввода данных с клавиатуры в файл. Другой пример — команда ftp
, после запуска которой приглашение тоже принимает такой вид.
Приглашение, задаваемое переменной
PS3
, используется в команде select
. Приглашение, задаваемое переменной
PS4
, выводится перед каждой командой, в то время, когда bash отслеживает процесс выполнения. Значение по умолчанию — "+".

Если у вас есть такое желание, вы можете изменить вид переменных
PS1
и
PS2
. При этом можно использовать как любые символы, вводимые с клавиатуры, так и некоторое число специальных символов, которые при формировании строки приглашения декодируются в соответствии с табл. 5.3 (приводим только некоторые из них, для примера; полный список см. в man­странице по утилите bash
).
Табл ица 5.3. Специальные символы для формирования приглашения
Сим вол
Его значение
\a
Звуковой сигнал (ASCII­код 07)
\d
Дата в формате "День, месяц, число", например, Срд, Окт, 17.
\h
Имя хоста (hostname) до первой точки
\H
Полное имя хоста
\t
Текущее время в 24­часовом формате: HH:MM:SS (часы:минуты:секунды)
\T
Текущее время в 12­часовом формате: HH:MM:SS
\@
Текущее время в 12­часовом формате am/pm
\u
Имя пользователя, запустившего оболочку
\w
Полное имя текущего рабочего каталога (начиная с корня)
\W
Текущий рабочий каталог (без указания пути)
\$
Символ #, если оболочка запущена суперпользователем, и символ $, если оболочка запущена обычным пользователем.
\nnn
Символ, имеющий восьмеричный код nnn
\n
Новая строка (перевод строки)
\s
Имя оболочки
\#
Текущий номер команды
\\
Обратный слэш (a backslash)
\[
Начало последовательности не печатаемых символов (этот символ может быть использован для того, чтобы включить в текст подсказки последовательность управляющих символов терминала)
\]
Конец последовательности не печатаемых символов

\!
Порядковый номер данной команды в истории команд
Текущий номер команды (порядковый номер выполняемой команды в рамках текущей сессии) может отличаться от номера данной команды в списке истории команд, поскольку последний включает в себя команды, которые были сохранены в файле истории команд.
После того, как значение переменной, определяющей подсказку, прочитано оболочкой, в нем могут быть произведены подстановки в соответствии с правилами расширения параметров, подстановок в именах команд и арифметических выражениях, а также разбиения слов (word splitting). Об этих правилах будет рассказано чуть ниже, в разд. 5.7.
Например, после выполнения команды (поскольку в строке имеется пробел, кавычки обязательны)
[root]# PS1="[\u@\h \W]\$"
в стандартном приглашении будет выводиться квадратная скобка, имя пользователя, символ
@
, имя компьютера, пробел, название текущего каталога (без указания пути), закрывающая квадратная скобка и символ
$
(если в оболочке работает простой пользователь) или
#
(если оболочка запущена от имени пользователя root).
5.6.3 Переменная PATH
Еще одна очень важная переменная имеет имя
PATH
. Она задает перечень путей к каталогам, в которых bash осуществляет поиск файлов (в частности, файлов с командами) в тех случаях, когда полный путь к файлу не задан в командной строке. Отдельные каталоги в этом перечне разделяются двоеточиями. По умолчанию переменная
PATH
включает каталоги /usr/local/bin, /bin,
/usr/bin, /usr/X11R6/bin, т. е. имеет вид:
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:
Для того, чтобы добавить каталог в этот список, нужно выполнить следующую команду:
[root]# PATH=$PATH:new_path.
При осуществлении поиска оболочка просматривает каталоги именно в том порядке, как они перечислены в переменной PATH.
Отметим, что можно включить в этот список и текущий каталог, добавив в переменную PATH точку. Однако этого не рекомендуется делать по соображениям безопасности: злоумышленник может положить в общедоступный каталог команду, имя которой совпадает с одной из часто выполняемых суперпользователем команд, но выполняющую совершенно другие действия
(особенно если текущий каталог стоит в начале перечня путей поиска).
5.6.4 Переменная IFS
Эта переменная задает разделители полей (Internal Field Separator), которые используются при операции разделения слов при преобразованиях командной строки, выполняемых оболочкой
перед тем, как запустить командную строку на исполнение. Значение этой переменной по умолчанию — "<Пробел><Символ_новой_строки>".
5.6.5 Текущий и домаш ний каталоги
Имя текущего каталога сохраняется в переменной окружения (с именем PWD), и значение этой переменной изменяется при каждом запуске программы cd
(а также при смене текущего каталога любым другим способом, например, через Midnight Commander).
Аналогичным образом полное имя (с указанием пути) домашнего каталога пользователя, запустившего данный процесс, сохраняется в переменной HOME.
5.6.6 Команда export
Когда оболочка запускает на выполнение какую­то программу или команду, она передает им часть переменных окружения. Для того, чтобы переменная окружения передавалась запускаемому из оболочки процессу, ее нужно задавать с помощью специальной команды export
, т. е. вместо
[user]$ name=value надо записать
[user]$ export name=value
В таком случае все запускаемые из оболочки программы (в том числе вторичные экземпляры самой оболочки) будут иметь доступ к заданным таким образом переменным, т. е. могут вызывать их значения по именам.
5.7. Раскрытие выраже ний (expansion)
Когда оболочка получает какую­то командную строку на выполнение, она до начала выполнения команды осуществляет "грамматический разбор" полученной командной строки. Одним из этапов такого "разбора" является раскрытие или подстановка выражений (expansion). В bash имеется семь типов подстановки выражений:

раскрытие скобок (brace expansion);

замена знака тильды (tilde expansion);

подстановка параметров и переменных;

подстановка команд;

арифметические подстановки (выполняемые слева направо);

разделение слов (word splitting);

раскрытие шаблонов имен файлов и каталогов (pathname expansion).
Все эти операции выполняются именно в том порядке, как они здесь перечислены. Рассмотрим их
последовательно.
5.7.1 Раскрытие скобок
Раскрытие скобок проще всего пояснить на примере. Предположим, что нам нужно создать сразу несколько подкаталогов в каком­то каталоге, или поменять владельца сразу у нескольких файлов. Эти действия можно выполнить с помощью следующих команд:
[user]$ mkdir /usr/local/src/bash/{old,new,dist,bugs}
[root]# chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
В первом случае в каталоге
/usr/local/src/bash/
будут созданы подкаталоги old
, new
, dist и bugs
. Во втором случае владелец будет изменен у файлов

/usr/ucb/ex

/usr/lib/ex?.?*

/usr/ucb/edit

/usr/lib/ex?.?*

/usr/ucb/ex

/usr/lib/how_ex

/usr/ucb/edit

/usr/lib/how_ex
То есть для каждой пары скобок генерируются несколько отдельных строк (их число равно числу слов, стоящих внутри скобок) путем приписывания к каждому слову из скобок (спереди) того, что стоит перед скобкой, и приписывания в конец каждого полученного слова того, что стоит после скобки. Еще один пример: строка a{d,c,b}e при раскрытии скобок превращается в три слова "ade ace abe".
Раскрытие скобок выполняется до выполнения других видов подстановок в командной строке, причем все специальные символы, встречающиеся в командной строке, в том числе внутри скобок, сохраняются неизменными (они будут интерпретированы на следующих этапах анализа строки).
5.7.2 Замена тильды (Tilde Expansion)
Если слово начинается с символа тильды ('
'), все символы до первого слэша (или все символы, если слэша нет) трактуются как имя пользователя (login name).
Если это имя есть пустая строка (т. е. вслед за тильдой идет сразу слэш), то тильда заменяется на значение переменной HOME. Если значение переменной HOME не задано, тильда заменяется на полный путь к домашнему каталогу пользователя, запустившего оболочку.

Если вслед за знаком тильды (до слэша) стоит слово, совпадающее с именем одного из легальных пользователей, тильда и имя пользователя заменяются полным именем домашнего каталога этого пользователя. Если слово, следующее за тильдой, не является именем пользователя (и не пусто), то оно остается неизменным.
Если вслед за знаком тильды стоит ‘+’, эти два знака заменяются на полное имя текущего каталога (т. е. значение переменной PWD). Если за знаком тильды следует ‘­‘, подставляется значение переменой OLDPWD.
5.7.3 Подстановка параметров и переменны х
Символ
$
используется для обозначения операций подстановки параметров, подстановки команд и подстановок арифметических выражений. Выражение или имя, следующее за
$
, может быть заключено в скобки; что не обязательно, но удобно, так как позволяет отделить заменяемое выражение от следующих за ним слов или символов. Таким образом, чтобы в командной строке вызвать значение параметра (в частности, любой переменной), нужно вставить выражение вида
${parameter}
Скобки необходимы только в том случае, если имя параметра состоит из нескольких цифр, или когда за именем следует символ, который не должен интерпретироваться как часть имени.
Все значения переменных подвергаются подстановке знака тильды, раскрытию параметров и переменных, подстановке команд, подстановкам арифметических выражений, а также удалению специальных символов цитирования (см. ниже). Разделение слов не производится, за исключением случая "$@" (объяснение см. выше в табл. 5.3). Раскрытие шаблонов имен файлов и каталогов не производится.
5.7.4 Подстановка команд
Подстановка команд является очень мощным инструментов bash
. Она заключается в замене имени команды на результат ее выполнения. Существует две формы подстановки команд:
$(command) `command`
и
Если применяется вторая из этих форм, то обратный слэш внутри кавычек трактуется как литерал, кроме тех случаев, когда за ним следует $, `, или \. Если же используется форма
$(command), все символы внутри скобок составляют команду и ни один из них не считается специальным символом.
Если подстановка производится внутри двойных кавычек, то в результатах подстановки не осуществляется разделение слов и раскрытие шаблонов имен файлов и каталогов.
5.7.5 Арифм етичекие подстановки (Arithmetic Expansion)
Арифметические подстановки позволяют вычислить значение арифметического выражения и подставить вместо него результат. Существует две формы задания арифметических подстановок:

$[expression]
$((expression)),
где expression трактуется так, как если бы оно было заключено в двойные кавычки, но встречающиеся в expression двойные кавычки трактуются как простой литерал. Внутри expression выполняются подстановки параметров и команд.
Синтаксис выражения expression подобен синтаксису арифметических выражений в языке C, подробнее об этом можно прочитать в разделе ARITHMETIC EVALUATION man­страницы по каманде bash
. Например, команда
[user]$ echo $(( 2 + 3 * 5 ))
в качестве результата выдает "17".
Если выражение некорректно, bash выдает сообщение об ошибке.
5.7.6 Разделение слов (word splitting)
После завершения подстановок параметров, команд и арифметических выражений оболочка снова анализирует командную строку (в том виде, который она приобрела к этому моменту) и осуществляет разделение слов (word splitting).
Эта операция заключается в том, что в командной строке ищутся все вхождения символов­
разделителей, определенных в переменой IFS, и в соответствующих местах строки разделяются на отдельные слова. Если значение IFS равно пустой строке, разделение слов не производится.
Если в командной строке не производилось никаких подстановок, то разбиение на слова не производится.
5.7.7 Раскрытие шаблонов имен фай лов и каталогов (Pathname Expansion)
Подстановки имен путей и файлов (Pathname expansion) используются для того, чтобы с помощью краткого образца или шаблона указать несколько имен файлов (или каталогов), соответствующих данному шаблону. После разделения слов, если не была задана опция ­f, bash производит поиск в каждом слове командной строки символов *, ?, and [. Если будет найдено слово с одним или несколькими вхождениями таких символов, то это слово рассматривается как шаблон, который должен быть заменен словами из лексикографически упорядоченного списка имен путей, соответствующих данному шаблону. Если имен, соответствующих шаблону, не найдено, и переменная nullglob не задана, слово не изменяется. Если эта переменная установлена, а путей, соответствующих шаблону не найдено, слово удаляется из командной строки.
Специальные символы шаблонов имеют следующее значение.
Табл ица 5.4. Символы шабл онов

Сим вол
Прав ила з амены
*
Соответствует произвольной строке символов, включая пустую строку. Например, my*.txt будет заменено на myday.txt, myweek.txt и mymonth.txt (если такие файлы существуют), а *.jpg соответствует всем файлам с расширением jpg в указанном каталоге
?
Соответствует любому одиночному символу. Например, вместо шаблона file?.txt будут подставлены имена file1.txt и filex.txt, но не file10.txt
[...]
Соответствует любому символу из числа символов, указанных в скобках. Пары символов, разделенные знаком минуса, обозначают интервал; любой символ стоящий лексически между этими двумя символами, включая и символы, задающие интервал, соответствует шаблону. Если первым символом внутри скобок является ! или ^, то считается, что шаблону (в данной позиции) соответствуют все символы, не указанные в скобках
Шаблоны имен файлов очень часто применяются в командных строках, содержащих команду ls
Представьте себе, что вы хотите просмотреть информацию о содержимом каталога, в котором находится огромное количество разных файлов различных форматов, например, файлов с изображениями форматов gif, jpeg, avi и т. д.. Чтобы получить только список файлов формата jpeg, вы можете использовать команду
[user]$ ls *.jpg
Если в каталоге имеется множество файлов, имена которых представлены четырехзначными номерами, то следующей командой можно вывести только список файлов с номерами от 0200 до
0499:
[user]$ ls -l 0[2-4]??.*
5.7.8 Удаление специальны х символов
После того, как все подстановки в командной строке сделаны, из нее еще удаляются все вхождения символов
\
,
`
и "
, которые служили для отмены специального значения других символов.

Document Outline

  • Linux для пользователя
  • Оглавление
  • Глава 1. ОС Linux: история и дистрибутивы
  • 1.1. Что такое ОС вообще и Linux в частности
    • 1.1.1 Семейство ОС типа UNIX
    • 1.1.2 Немного истории
    • 1.1.3 Основные характеристики ОС Linux
      • Реальная многозадачность
      • Многопользовательский доступ
      • Свопирование оперативной памяти на диск
      • Страничная организация памяти
      • Загрузка выполняемых модулей "по требованию"
      • Совместное использование исполняемых программ
      • Общие библиотеки
      • Динамическое кеширование диска
      • 100%-ное соответствие стандарту POSIX 1003.1. Частичная поддержка возможностей System V и BSD
      • System V IPC
      • Возможность запуска исполняемых файлов других ОС
      • Поддержка различных форматов файловых систем
      • Сетевые возможности
      • Работа на разных аппаратных платформах
  • 1.2. Дистрибутивы Linux
  • 1.3. Требования к компьютеру
  • 1.4. Где взять Linux?
  • Глава 2. Инсталляция ОС Linux на компьютер с Windows.
  • 2.1. Подготовка к инсталляции.
  • 2.2. Предостережения и рекомендации
  • 2.3. Разделы на диске и процесс загрузки
    • 2.3.1. Что такое "геометрия диска"?
    • 2.3.2. Разделы диска и таблица разбиения диска.
    • 2.3.3. Процесс загрузки ОС фирмы Microsoft
    • 2.3.4. Проблемы с большими дисками
  • 2.4. Выбор загрузчика
    • 2.4.1. Загрузчик LILO из дистрибутива ОС Linux
    • 2.4.2. Другие загрузчики ОС
    • 2.4.3. Варианты загрузки
  • 2.5. Подготовка разделов на диске
    • 2.5.1. Рекомендации по созданию разделов
    • 2.5.2. Программы для разбиения диска
  • 2.6. Windows NT и Linux : загрузка через OS Loader от NT
  • 2.7. Использование загрузчика LILO
    • 2.7.1. Установка и настройка загрузчика LILO
    • 2.7.2. Установка других операционных систем после Linux
    • 2.7.3. Перенос каталога /boot в DOS-раздел
  • 2.8. Загрузка Linux из MS-DOS с помощью loadlin.exe
  • лава 3. Первый запуск ОС Linux
  • 3.1. Загрузка ОС Linux
  • 3.2. Вход в систему
  • 3.3. Консоль, виртуальные терминалы и оболочка
  • 3.4. Редактирование командной строки. История команд
  • 3.5. Завершение работы системы Linux
  • 3.6. Помощь по работе с Linux
    • 3.6.1. Источники справочной информации
    • 3.6.2. Страницы интерактивного руководства man
    • 3.6.3. Команда info
    • 3.6.4. Команда help
    • 3.6.5. Документация, поставляемая с дистрибутивом и пакетами ПО
    • 3.6.6. Команда Xman
    • 3.6.7. Команда helptool
    • 3.6.8. Книги и Интернет
  • Глава 4. Знакомство с файловой системой ext2fs
  • 4.1. Файлы и их имена
  • 4.2. Каталоги
  • 4.3. Назначение основных системных каталогов
  • 4.4. Типы файлов
    • 4.4.1. Файлы физических устройств
    • 4.4.2. Именованные каналы (pipes)
    • 4.4.3. Доменные гнезда (sockets)
    • 4.4.4. Символические ссылки (еще раз об именах файлов)
  • 4.5. Права доступа к файлам и каталогам
  • 4.6. Команды для работы с файлами и каталогами
    • 4.6.1. Команды chown и chgrp
    • 4.6.2. Команда mkdir
    • 4.6.3. Команда cat
    • 4.6.4. Команда cp
    • 4.6.5. Команда mv
    • 4.6.6. Команды rm и rmdir
    • 4.6.7. Команды more и less
    • 4.6.8. Команда find и символы шаблонов для имен файлов
    • 4.6.9. Команда split — разбиваем файл на несколько частей
    • 4.6.10. Сравнение файлов и команда patch
  • 4.7. Команды архивирования файлов
    • 4.7.1. Программа tar
    • 4.7.2. Программа gzip
    • 4.7.3. Программа bzip2
  • 4.8. Создание и монтирование файловых систем
  • Глава 5. Оболочка bash
  • 5.1. Что такое оболочка?
  • 5.2. Специальные символы
  • 5.3. Выполнение команд
    • 5.3.1 Оператор ;
    • 5.3.2 Оператор &
    • 5.3.3 Операторы && и ||
  • 5.4. Стандартный ввод/вывод
    • 5.4.1. Потоки ввода-вывода
    • 5.4.2 Команда echo
    • 5.4.3 Команда cat
  • 5.5. Перенаправление ввода/вывода, каналы и фильтры
    • 5.5.1 Операторы >, < и >>
    • 5.5.2 Оператор |
    • 5.5.3 Фильтры
  • 5.6. Параметры и переменные. Окружение оболочки
    • 5.6.1 Разновидности параметров
    • 5.6.2 Приглашения оболочки
    • 5.6.3 Переменная PATH
    • 5.6.4 Переменная IFS
    • 5.6.5 Текущий и домашний каталоги
    • 5.6.6 Команда export
  • 5.7. Раскрытие выражений (expansion)
    • 5.7.1 Раскрытие скобок
    • 5.7.2 Замена тильды (Tilde Expansion)
    • 5.7.3 Подстановка параметров и переменных
    • 5.7.4 Подстановка команд
    • 5.7.5 Арифметичекие подстановки (Arithmetic Expansion)
    • 5.7.6 Разделение слов (word splitting)
    • 5.7.7 Раскрытие шаблонов имен файлов и каталогов (Pathname Expansion)
    • 5.7.8 Удаление специальных символов



Поделитесь с Вашими друзьями:
1   2   3   4   5   6


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал