Академический Документы
Профессиональный Документы
Культура Документы
Progr Komand Obol Unix
Progr Komand Obol Unix
Программирование
командных
оболочек
в Unix, Linux и OS Х
Программирование
командных оболочек
в Unix, Linux и OS Х
4-е издание
Shell Programming in
Unix, Linux and OS Х
Fourth Edition
Stephen G. Kochen
Patrick Wood
•
......
Addison
Wes\ey
4-е издание
Научно-популярное издание
Стефан Кочан, Патрик Вуд
Программирование командных оболочек в Unix, Linux и OS Х
4-еиздание
Литературный редактор И.А. Попова
Верстка Л.В. Чернокозинская
Художественный редактор В.Г. Павлютин
Корректор Л.А. Гордиенко
Введение 17
Об авторах 15
Введение 17
Структура книги 18
От издательства 20
Глава 1. Краткий обзор основ 21
Некоторые основные команды 21
Отображение даты и времени: команда da te 21
Выявление пользователей, зарегистрированных в системе: команда who 21
Эхоотображение символов: команда echo 22
Манипулирование файлами 22
Переч ислен ие файлов: команда 1 s 23
Отображение содержимого файла: команда ca t 23
Подсчет количества слов в файле: команда wc 23
Дополнительные параметры команд 24
Создание коп ии файла: команда ер 24
Переи менование файла: команда mv 25
Удаление файла: команда rm 25
Манипул ирование каталогами 26
Начальный каталог и пути к файлам 27
Отображение рабочего каталога: pwd 28
Смена каталогов: команда cd 28
Дополн ительные сведения о команде 1 s 31
Создание каталога: команда mkdir 33
Копирование файла из одного каталога в другой 34
Перемещение файлов из одного каталога в другой 35
Связывание файлов: команда ln 36
Удаление каталога: команда rmdir 40
Подстановка и мен файлов 40
Знак звездоч ки 41
Совпадение с одиночными си мволами 42
Особенности указания и мен файлов 44
Пробелы в и менах файлов 44
Другие необычные си мволы 45
Содержа ние 7
Параметр -n 98
Удален ие строк 99
Команда t r 100
Параметр s - 103
Параметр - d 104
Команда g rep 105
Регулярные выражения и команда grep 108
Параметр -v 109
Параметр -1 1 10
Параметр -n 111
Команда s o r t 111
Параметр - u 1 12
Параметр - r 1 12
Параметр -о 1 13
Параметр -n 1 14
Пропуск полей 1 14
Параметр - t 1 15
Другие параметры 1 16
Команда uniq 1 16
Параметр -d 1 17
Другие параметры 1 19
Команда s e t 408
Команда s h i f t 4 10
Команда t e s t 411
Команда t ime s 4 13
Команда t rap 4 13
Команда t rue 4 15
Команда t уре 4 15
Команда uma s k 4 15
Команда unal i a s 4 16
Команда uns e t 4 16
Команда unt i l 4 16
Команда wa i t 4 17
Команда while 4 17
Не секрет, что семейство Unix и Uniх- подобных операцион ных систем стало за
последние нескол ько десятилети й самым распространенным и ш ироко употре
бляемым в современ ной выч ислител ьной технике. Для программистов, пользу
ющихся Unix многие годы, в этом нет н ичего уди вительного, ведь система Unix
предоставляет изящную и э фф ективную среду для программирования. Именно
такую среду и стремились создать Ден н и с Ритчи ( Dennis Ritchie) и Кен Томпсон
(Ken Thompson), разрабатывая Unix в компани и Bell Laboratories в кон це 1960-х
годов.
П римеча н ие
На п ротя жен и и всей кни ги терм ином Unix, как п ра в ило , обозначается обш и рное семейство
основа н н ых на U n ix операцио н н ых систем (О С ). в кл ючая та кие ОС типа Unix, ка к Solaris. а
та кже U n iх-подо б н ые О С в роде Li n ux и М ае OS Х.
К числу самых сильных сторон системы Unix относится обш ирный ряд про
грамм. В стандартной распространяемой верси и ОС Unix насчитывается более
200 основных команд, ч исло которых в обыч ной версии Li nux дости гает 700- 1ООО!
Эти команды, называемые также инструментами, выполняют самые разные дей
ствия: от подсчета количества строк в ф айле до отправки электрон ной почты и
отображения календаря на любой год. Исти нн ый потен циал системы Unix кроет
ся не только в большом наборе команд, но и в изяществе и простоте, с которы ми
можно их сочетать для решен ия намного более сложных задач.
Стандартным пол ьзовател ьски м интер ф ейсом в Unix служит командная стро
ка, которая, по существу, является командным процессором или оболочкой - про
граммой , выполняющей роль посредника между пользователем и более н изкими
уровнями самой системы, образующими ее ядро Проще говоря, оболочка - это
.
Все примеры применен ия, приведенные в дан ной книге, были проверены на
компьютере Macintosh, работающем под управлением ОС Мае OS Х lO. l l, Ubuntu
Linux 14.0, а также на рабочей стан ции Sparcstation Ultra-30 со старой версией
SunOS 5.7. За исключен ием некоторых примеров применен ия в оболоч ке Bash из
главы 14, все примеры выполнялись в оболоч ке Korn, хотя все они вполне рабо
тоспособны и в оболочке Bash.
Оболоч ка предоставляет интерпретируемый язык програм мирования, позво
ляющий быстро и просто п исать, видоизменять и отлажи вать программы. Мы
прибегаем к оболочке как к первому избран ному нами варианту языка програм
мирования после того, как научились искусно программировать на языке оболоч
ки. Надеемся, что и вы последуете нашему примеру.
Структур а кн иги
В этой книге предполагается, что вы знакомы с основами системы Unix и ре
жимом работы в командной строке, т.е. знаете, как входить в систему, создавать
в ней файлы, редактировать и удалять их и как работать с каталогами. А на тот
случай, если вы давно не пользовались системой Unix или Linux, мы изложим са
мые основы в главе l "Краткий обзор основ': где также поясняется порядок под
становки и мен файлов, переадресация ввода-вывода и каналы.
В главе 2 "Назначение оболоч ки" поясняется, что собой представляет оболоч
ка, как она действует и каким образом становится в конечном итоге основным
средством взаимодействия с самой операцион ной системой . Из этой главы вы уз
наете также, что происходит при входе в систему, каким образом программа обо
лоч ки запускается на выполнен ие, как в ней производится си нтаксический ана
лиз и автоматическое выполнение других программ. Главное внимание в дан ной
главе уделяется тому обстоятельству, что оболочка является не более чем обыч
ной программой .
В главе 3 "Рабочие и нструменты" представлен учебный материал по инстру
ментам, полезным для написания программ в оболочке. В частности , рассматри
ваются команды cut, paste, sed, g rep, sort, tr и un i q. И хотя их выбор носит
субъективный характер, тем не менее, он подготавли вает почву для разработки
программ, рассматри ваемых в остальной части к н и ги . Кроме того, подробно рас
сматриваются регулярные выражения, применяемые во многих командах Unix, в
том числе s ed, g rep и ed.
Из глав 4-9 вы узнаете, как пол ьзоваться оболоч кой на практи ке для напи
сания программ. В частности , вы научитесь писать свои команды; пользовать
ся переменными; писать програм мы, при н имающие аргументы; делать выбор;
пользоваться ком андами оболоч ки for, wh i l e и unt i 1 для орган изации ци
клов; а также читать дан ные из терми н ала или файла по команде read. Глава 5
Структура кн и г и 19
От и з да тел ьств а
Вы, читатель этой книги, и есть главный ее критик. Мы цен им ваше мнение и
хотим знать, что было сделано нами правильно, что можно было сделать лучше
и что еще вы хотел и бы увидеть издан ным нами. Нам интересны любые ваш и за
мечания в наш адрес.
Мы ждем ваших комментариев и надеемся на н их. Вы можете прислать нам
'
бумажное или электронное письмо л ибо просто посетить наш веб-сайт и оста
вить свои замечания там. Одн им словом, л юбым удобным для вас способом дайте
нам знать, нравится л и вам эта книга, а также выскажите свое мнение о том, как
сделать наши книги более интересными для вас.
Отправляя письмо или сообщение, не забудьте указать название книги и ее
авторов, а также свой обратный адрес. Мы внимательно ознаком имся с вашим
мнен ием и обязательно учтем его при отборе и подготовке к изданию новых книг.
Не которые осно в н ые ко м а нд ы
Отображение даты и времени : команда da te
Команда da te предписывает системе вывести дату и время, как показано ниже.
$ date
T h u Dec 3 11:04:09 MST 2 015
$
онный номер, который система Unix присваи вает каждому терми налу или сетево
му устройству, с которого пользователь входит в систему.
22 Глты 1. Кратки й обзор основ
Ма н и п ул и ро в а н и е ф а йл а м и
В системе Unix распознаются только следующие типы файлов: обыкновенные
файлы, каталоги и специальные файлы. Обыкновен ным в системе считается лю
бой файл, содержащи й данн ые, текст, инструкции программы и практически все,
что угодно. Каталоги (или папки) рассматри ваются далее в этой главе. И, наконец,
специальный файл, как подразумевает его название, и меет специальное назначе
ние в системе Unix, и, как правило, связан с определенной формой ввода-вывода.
Имя файла может состоять из всех символов, непосредственно доступ ных, а
и ногда и не доступ н ых, для ввода с клавиатуры, при условии, что их общее коли
чество не превышает 2 5 5 . Если же в имени файла указано больше 2 5 5 символов,
система Unix проигнорирует лишние символы.
М а н и пул и рование фа й л а м и 23
тат, вы води мый по команде l s , может отл ичаться в разных системах.) Например,
в больш и нстве си стем Unix результат выполнения команды l s выводится в не
скольких столбцах, есл и он направляется на терми нал, а в некоторых системах
разн ые ти п ы файлов могут выделяться отдельными цветами . Чтобы вывести ре
зул ьтат в одном столбце, достаточ но указать в команде l s параметр -1, обозна
чающи й коли чество столбцов.
'
Подсч ет к ол ичества слов в файле : команда wc
Выполнив команду wc, можно получить подсчитан ное в итоге коли чество
строк, слов и сим волов, содержащихся в файле. И в этом случае в качестве аргу
мента команды wc предполагается имя файла:
$ wc names
S 7 27 name s
$
24 J11ава 1. Кратки й обзор основ
-бужsа
Это означает, что параметр команды указывается одной буквой сразу же после
знака "м инус': Напри мер, чтобы подсчитать количество строк в файле, достаточ
но указать параметр -1 (т.е. букву 1 после знака "минус") в команде wc, как по
казано ниже.
$ wc -1 names
5 name s
$
$ ер names saved_names
$
В результате выполнения этой команды содержи мое файла name s коп ируется
в новый файл s aved name s . Как и при выполнении м ногих других команд Unix,
_
команду:
$ mv saved names hold i t
$
Будьте вни мательны, выполняя команду mv или ер! Ведь систему Unix не и н
тересует, существует л и уже файл, указанный в качестве второго аргумента. Если
он существует, его содержимое теряется. Так, если файл o l d name s существует,
то в результате выполнения команды
ер names o ld_name s
файл name s будет скопирован в файл o l d name s , разруш ив в ходе этого процес
_
команды
mv name s o ld name s
Чтобы удалить больше одного файла по команде rm, достаточно указать все
подобные файлы в командной строке. Например, в следующей команде можно
удалить три файла wb, eo l l eet и mon:
$ rm wb collect mon
$
26 Гл а ва 1. Краткий обзор осно в
М а н и пул и ро в а н и е катал о га м и
Допустим, и меется оди н ряд файлов, содержащих различ ные заметки , пред
ложения и письма, а также другой ряд файлов, содержащих компьютерные про
граммы. Было бы вполне логично сгруппировать первый ряд файлов в каталоге
document s , а второй - в каталоге prograrns. Подобная орган изация каталогов
приведена на рис. 1. 1.
1
documents
1
1
pro rams
1 1 1 1 1 1 1
plan dact sys.A new:hire no.JSK AMG. reply wb collect mon
1
documents
1
programs
memos
1proposals letters wb
1
col!ect mon
п
plan dact
п
sys. A
п
new.hire no. JSK AMG. reply
memos
1
proposals letters wb
1
collect mon
г1-�
plan dact
г1-�
sys.A new. hire
г1-�
no.JSK AMG. reply
вило, указать путь к кон кретному файлу можно несколькими способами, что
весьма характерно для системы Unix.
Еще одн им условным обозначением является одиночный знак точ ки ( .), который
всегда обозначает текущий каталог. Такое обозначение приобретет большее значе
ние далее в книге, когда речь пойдет об указании сценария оболочки в текущем ка
талоге, а не в переменной окружения РАТН. Ниже мы поясним это более подробно.
/
1
users
memos
1
proposals letters wb
1
collect mon
г1--�
plan dact
г1--�
sys.A new. hire
г1--�
no.JSK AMG.reply
Вам известно, что ниже вашего начального каталога s teve расположены еще
два каталога, do cumen t s и prog rams. В этом нетрудно убедиться, введя команду
l s, как показано ниже. По команде l s каталоги documents и programs переч ис
ляются таким же образом, как и обыкновен ные файлы в предыдущих примерах.
$ ls
docume n ts
programs
$
Чтобы смен ить текущий рабочи й каталог, достаточно ввести команду cd, ука
зав после нее имя нового каталога:
$ cd documen ts
$
memos
1 proposals letters wb
1
collect mon
г1--�
plan dact
г1--�
sys.A new. hire
г1--�
no.JSK AMG.reply
/
1
users
ruth
1
programs
п
plan dact
п
sys.A new. hire
п
no.JSK AMG.reply
1
1
users
steve ruth
1
1
ocumeпts
1
programs
memos
1 � � J
proposals
1 lett rs<= wb
1
collect mon
г1-�
plan dact
г1-� г1-�
sys.A пew. hire no.JSK AMG.reply
П римеча н ие
Во многих современных системах U n ix больше не испол ьзуются груп п ы пользователей . По·
этому п ри отобра ж е нии прав доступа к фа йлу и ли каталогу по кома нде l s сведен ия о его
груп повом владельце зачастую опускаются.
Знак дефиса в первом столбце при веденного выше результата обозначает, что
в данном каталоге присутствуют три обы кновенных файла, co l l ect, mon и wb,
но не ка'fалоги. Сумеете ли вы теперь выясн ить, наскол ько они велики?
$ mkdir mise
$
memos
1proposals letters wb
1 1
collect mon
п
plan dact
п
sys.A new.hire
п
no. JSK AMG . reply
Если оба файла находятся в разных каталогах, они могут впо11 не носить одно
и то же имя:
$ ер programs/wb mi se/wb
$
При выпол нен и и приведенной выше команды система Unix распознает ката
лог в качестве второго аргумента данной команды и копи рует исходный файл в
этот каталог. Новому файлу присваивается такое же имя, как и у исходного файла.
В указанный каталог можно скопировать не оди н, а несколько файлов, пере
числив их перед и менем целевого каталога. Так, если вы н аходитесь в каталоге
prograrns, то по команде
$ер wb eol leet mon . . /mi se
$
М а н ипули рован ие каталога ми 35
сможете скопировать три файла, wb, eo l le et, и mon, в каталог mi s e под теми же
самыми именами.
Чтобы скопировать файл из другого каталога в текущи й каталог и присвоить
новому файлу то же самое имя, воспользуйтесь удобным сокращенным обозначе
нием ( . ) текущего каталога. Так, по указанной н и же команде ер файл eo l l e e t
копируется и з каталога . . /p rog rams в текущий каталог ( /u s e r s / s teve /
mi s e).
$ pwd
/ u s e r s / s t e ve /mi s c
$ ер . . / p rog r ams / c o l l e c t
$
Как и в команде ер, в команде mv достаточ но указать только имя целевого ка
талога, если имена исходного и целевого файлов оди наковы. Следовательно, файл
p l an проще всего переместить по следующей команде:
$ mv m,эmos /plan proposals
$
Теперь вместо двух копий одного файла существует только одна его копия под
двумя именам и : wb и wr i teba c k. В итоге оба файла оказываются логически свя
занными в системе Unix.
Складывается такое впечатление, будто теперь и меются два разнь1х файла про
граммы. В самом деле, если выполн ить программу 1 s, то в конеч ном итоге будут
показаны два отдельных файла wb и wr i teba c k:
-
$ ls
c o l l e ct
М а н ипул ирован ие каталога м и 37
mo n
wb
w r i t e ba c k
$
Чаще всего команда l n применяется для того, чтобы оди н файл мог одновре
менно появиться в нескольких каталогах. Допустим, пол ьзователю pat требуется
доступ к файлу программы wb пользователя s t eve. Вместо того чтобы сделать
себе КQП И Ю этого файла (и тем самым навлечь на себя описанные выше ослож
нения, возникающие в связи с синхронизацией копи й оди наковых файлов) или
включить каталог programs, где н аходится файл программы wb, в переменн ую
окружения РАТН, что связано с риском нарушения безопасности, как поясняется
в главе 10, пользователь pat может просто связать дан ный файл с каталогом сво
их программ следующим образом:
$ pwd
/ u s e r s / pa t / Ь i n ка талог пр оrрамм пользо ва т еля pa t
$ ls -1
total 4
38 Гл а в а 1 . Кратк ий о бзор основ
теля pat. И в этом есть свой смысл, ведь на самом деле имеется лишь одна коп ия
файла, которой владеет пользователь s t eve.
В отношен и и связывания файлов необходи мо сделать следующую оговорку:
связываемые вместе обыкновенные файлы должны непременно находиться в од
ной и той же файловой системе. В противном случае при попытке связать файлы
по команде ln будет выдана ошибка. (Чтобы выявить разные файловые системы
в своей системе, выполните команду df. В первом поле каждой строки результата
выполнения этой команды указывается наименование файловой системы.)
Чтобы связать файлы в разных файловых системах (или в разных сетевых си
стемах), достаточ но указать параметр - s в команде l n. В итоге будет образована
символическая ссылка. Своим поведением си мволические ссыл ки очень похожи
на обычные ссылки, за исключением того, что символи ческая ссылка указывает
на первоначальный файл. Если же первоначальный файл удаляется, символиче
ская ссылка бол ьше не действует.
Выясним, каким образом действуют символические ссыл ки, на следующем
примере:
$ rm wb
$ ls 1 -
total 4
- rw x r - x r - x 1 pat DP3 8 2 2 1358 Jan 1 5 1 1 : 0 1 lcat
- rwx r - x r - x 1 pa t D P3 8 2 2 504 Apr 2 1 1 8 : 3 0 xtr
$ l n - s /users / s teve/wb . / symwЬ симв оли ч еска я ссылка на файл wЬ
$ l s -1
total 5
- rw x r - x r - x 1 pat DP3 8 2 2 1 3 5 8 Jan 1 5 1 1 : 0 1 lcat
l rwx r - x r - x 1 pat DP3 8 2 2 1 5 Ju l 2 0 1 5 : 2 2 s yrnwb - >
/ u s e r s / s t e v e / wb
- rwx r - x r - x 1 pat DP3 8 2 2 5 0 4 Ap r 2 1 1 8 : 3 0 xtr
$
Как видите, пользователь перечислен в дан ном примере как владелец файла
s ymwb, а тип этого файла обозначен самым первым символом 1 в результате,
М а н и пул ирова н ие каталога м и 39
Файл такого типа называется висяч е й символич еской ссылкой и должен быть
удален, если только нет особых причин сохранить его (например, для того, чтобы
заменить удаленный файл).
И прежде чем завершить рассмотрение команды l n, необходимо заметить, что
она придерживается такой же формы, как и команды ер и mv. Это означает, что
ссылки на группу файлов в конкретном целевом каталоге можно создавать, ис
пользуя следующую форму команды l n:
ln фа йлы ка талог
40 r н а в а 1 . Кратки й обзор основ
И в этом случае команда rmdi r будет выполнена лишь при услови и, что в ка
талоге rni s c не окажется ни файлов, ни подкаталогов. В проти вном случае про
изойдет то же самое, что и прежде, как показано ниже. Если каталог rni s c тре
буется все-таки удалить, необходимо сначала удалить из него все файлы, а затем
выдать команду rrndi r еще раз.
$ rmdi r /users / s teve/misc
rmd i r : / u s e r s / s t e ve /mi s c : D i r e c t o r y n o t emp t y
$
где ка талог - имя удаляемого каталога. Команда rrn удаляет указанный каталог
и все файлы в нем, включая и подкаталоги. Поэтому пользуйтесь этой мощной
командой очень аккуратно.
Чтобы избавиться от л и ш н их хлопот, связанных с необходи мостью реагиро
вать каждый раз на приглашение удалить содержи мое каталога, достаточно ука
зать допол нительный параметр -f в команде rm. Но подобным образом можно
по неосторожности легко опустошить всю систему, и поэтому многие системные
администраторы избегают пользоваться командой rrn - r f!
П одста н о в ка и м ен ф а йл ов
В последующих разделах описываются различные механизмы подстановки
имен файлов.
П одста новка и мен фа йлов 41
Зна к звездоч к и
К числу самых эффективных средств системы Unix, употребляемых в оболоч
ке, относится подстановка имен фа йлов. Допустим, в текущем каталоге находятся
следующие файлы:
$ ls
chap t l
chap t 2
cha pt 3
cha p t 4
$
Допусти м также, что требуется отобразить все содержимое этих файлов. Это
нетрудно сделать по команде са t, позволяющей отображать содержимое столь
ких файлов, сколько указано в командной строке:
$ cat chapt l c h a p t 2 c h ap t 3 c h a p t 4
chapt l
42 Гп а ва 1 . Кратк и й обзор осно в
chapt 2
chap t З
chapt 4
$
Чтобы отобразить содержимое только тех файлов, имена которых нач и наются
на chap, достаточ но ввести следующую команду:
$ cat chap*
$ ls
а
аа
аах
a l i ce
ь
ьь
с
се
repo r t l
repo r t 2
repo r t З
$ echo ?
а Ь с
$ echo а?
аа
$ echo ? ?
аа ЬЬ се
$ echo ? ? *
аа аах a l ice Ь Ь се repo r t l r e po r t 2 r e po r t З
$
совпадает имя файла с любым си мволом, кроме строч ных букв, а с шаблоном
* [ ! о]
c a t : t e s t : N o s u c h f i l e or d i re c t o r y
c a t : documen t : N o s uc h f i l e o r d i r e c t o r y
Почему не удается выпол н ить приведен ную выше команду cat ? А потому что
ей требуется имя файла, и вместо одного файла она обнаруживает целых три: my,
te s t и document.
Имеются два стандартн ых выхода из этого затруднительного положения: экра
нировать каждый пробел знаком обратной косой черты или заключить все имя
файла в кавычки, чтобы оболочка и нтерпретировала его как одно слово с пробе
лам и, а не ряд слов, разделяемых пробелами. Оба эти варианта демонстрируются
в следующем при мере:
$ ca t "my tes t document "
Th i s i s а te s t docume n t and i s f u l l
o f s c i n t i l l a t i n g i n fo rma t i on t o ed i f y
and ama z e .
$ ca t my\ test\ document
Th i s i s а t e s t d o c ume n t a n d i s fu l l
o f s c i n t i l l a t i n g i n f o rma t i o n t o e d i f y
a n d ama z e .
(Э то тестовый документ , на п олненный блестяще й
ин ф орма цие й дл я на з ида ния и изумл ения . )
работающих в системе Li nux или Мае OS. В таком случае для экранирован ия имен
файлов, содержащих двой ные кавычки, следует употребить оди ноч ные кавычки,
и наоборот:
$ ls - 1 "don ' t quote me " ' She said "yes " '
- r w- r - - r - - 1 taylor s ta f f О De c 4 1 0 : 1 8 do n ' t qu o t e me
- rw - r - - r - - 1 taylor staff О De c 4 1 0 : 1 9 She s a i d "yes "
Мы еще вернемся к этому вопросу далее в к н и ге, но теперь вы уже знаете, как
справиться с и менами файлов или каталогов, содержащими пробелы и другие не
обычные символы.
� ai tty0 1 Sep 12 07 : 30
__________ __, oko tty36 Sep 12 1 3 :32
who pat tty2 1 Sep 12 1 0: 1 0
ruth tty24 Sep 12 1 3 :07
� ,
'
steve
'
'
tty25 Sep 12 1 3 : 03
'
'
'
'
'
'
�
Р ис. 1.10. Порядок вы пол нен ия команды who
Оказывается, что практически каждая оди ночная команда Unix может при
нять результат, выводимый командой , или файл в качестве своего ввода и даже
послать результат своего выполнен ия другой команде или программе. Этот при н
ц и п ввода-вывода очень важен для пон имания сильных сторон командной стро
ки и причин, по которым полезно знать все рассматриваемые здесь команды, даже
есл и у вас есть возможность пользоваться графическим интерфейсом.
Но прежде рассмотрим следующее: если команда s o r t вызы вается без имени
файла в качестве аргумента, она принимает свои входные дан ные из стандартного
ввода. Как и стандартным вы водом, по умолчан и ю стандартны м вводом служит
терм инал (или клавиатура).
Когда дан н ые вводятся подобным образом, последовательность окончания
файла должна быть указана после ввода последней строки. В системе Unix с этой
цел ью принято нажимать комбинацию клави ш <Ctrl+d>, т.е. нажать одновремен
но клавиши <Ctrl> и <d>.
В качестве при мера воспользуемся командой sort для сортировки следующих
имен: Tony, Barba ra, Harry, Di r k. Вместо того чтобы вводить эти имена снача
ла в файл, введем их непосредственно с терми нала следующим образом:
$ sort
Tony
Вarbara
Harry
Dirk
<Ct r l + d>
Ba rba r a
Di r k
Harry
Tony
$
48 Гл а в а 1 . Кратк и й обзор основ
В дан ном при мере команде s o r t не было указано имя файла, и поэтому исход
ные дан ные взяты из стандартного ввода, которым служит терминал. После ввода
четвертого имени была нажата комбинация клавиш <Ctrl+d>, обозначающая ко
нец ввода дан ных. Вслед за этим команда s o r t отсортировала четыре введенных
имени и отобразила результат сортировки на устройстве стандартного вывода,
которым также служит терми нал (рис. 1. 1 1 ) .
Топ у Barbara
Barbara sor1 Dick
Harry
Переадреса ци я в ывода
Как правило, резул ьтат вы полнения команды, предназначен ный для стандарт
ного вывода, нетрудно перенаправить в файл. Такая возможность называется
переадресацией вывода и не менее важна для уяснения истинного потен циала си
стемы Unix.
Ста нда ртны й в вод-в ы вод и его переадресация 49
В данном при мере команда who направляет резул ьтат своего выполнения в
файл u s e r s . Обратите внимание на отсутствие отображаемого результата. Дело
в том, что вы водимый результат был переадресован из устройства стандартного
вывода (т.е. терминала) в указанный файл. В этом можно убедиться следующи м
образом:
$ cat users
o ko t t yO l Sep 12 07 : 30
ai ttyl 5 Sep 12 13: 32
ruth t t y2 1 Sep 12 10: 10
pat t t y2 4 Sep 12 13 : 07
s t e ve t t y2 5 Sep 12 13 : 03
$
Есл и команда переадресует резул ьтат своего выполнения в файл, который уже
содержит некоторые дан н ые, эти дан н ые будут перезаписаны и утрачены. Рас
смотрим следующий пример:
$ echo l ine 1 > users
$ ca t users
l i ne 1
$
Вни м ательно присмотревшись к при веден ной выше команде e cho, вы обнару
жите, что в ней употребляется совсем другой тип переадресации вывода, обозна
чаемый знаками >>. При такой переадресаци и стандартный вывод из команды
присоединяется к содержимому указанного файла. Прежнее содержимое файла
не теряется, а новое содержимое (т.е. выводимый командой результат) просто
присоединяется в его конце.
Указав в команде cat знаки >>. обозначающие переадресацию с присоеди не
н ием, содержимое одного файла можно присоеди нить в кон це другого файла сле
дующим образом:
50 Гл а ва 1 . Кратк и й о б зор основ
$ cat filel
Th i s is in f i l e l .
(Э то содержнмое файла fi l e l )
$ cat fi le2
Th i s i s i n f i l e 2 .
( А э то содержимое фа йла fi l e2)
$ cat filel >> fi le2 При соединить фа йл filel к фа йлу file2
$ cat fi le2
T h i s i s in f i l e 2 .
Th i s i s i n f i l e l .
$
В данном примере команда cat вполне оправдывает свое назван ие. Есл и в ней
указано несколько файлов, то она сцепляет их вместе.
П ереадреса ц ия ввода
Ввод для команды из файла может быть переадресован таким же образом,
как и вы вод из команды. И есл и для обозначен и я переадресации вы вода служит
знак >, то для обозначен ия переадресации ввода - знак <. Безусловно, переадре
сация ввода из файла допускается только в тех командах, которые обыч но при
н имают свои исходные данн ые из стандартного ввода.
Чтобы переадресовать ввод, достаточно указать знак < и имя файла, откуда
производится ввод. Например, для того чтобы подсч итать количество строк в
файле u s e r s , достаточно, как вам должно быть уже известно, выполн ить коман
ду wc с параметром -1:
$ w c -1 users
2 users
$
Ка налы 51
Оказывается, что для подсчета кол ичества строк в файле достаточ но пере
адресовать стандартн ый ввод из него в команду wc таким образом:
$ wc -1 < users
2
$
К а н ал ы
Есл и помните, созданный ранее фай11 u s e r s содержит список всех пользова
телей, зарегистрированных в настоящий момент в системе. А поско11ьку известно,
что в этом файле на каждого зарегистрированного пользователя приходится от
дельная строка, то нетрудно определ ить количество сеансов регистрации, под
считав количество строк в файле u s e r s :
$ who > users
$ wc -1 < users
5
$
Канал, устанавли ваемый между эти ми двумя командам и, наглядно пок � зан на
рис. 1 . 1 2.
'
/
/f , '
/ '
/ '
/ '
/ '
/ '
/ '
/ '
/ '
/ '
$ ls 1 wc -1
10
$
-.
"
/
/
/
/
/
/
/
/
/
/
who wc - 1 5
� � �'
'
'
'
'
'
'
'
'
'
�
Рис. 1 . 13. Кон вейерн ы й п роцесс
Ф ил ьт ры
Термин фильтр нередко употребляется в терминологии Uпix для обозначен ия
любой программы, которая способна при н имать входные дан ные из стандартно
го ввода, выпол нять какую-нибудь операцию над этим и данными и направлять
полученный результат в стандартный вывод. Короче говоря, фильтром может
служить любая программа, с помощью которой можно видоизменить результат
выполнения других программ в конвейере. Так, в кон вейере из п редыдущего при
мера команда wc считается фильтром, а команда 1 s таковой не считается, по
скольк у она не ч итает свои исходные данные из стандартного ввода. В качестве
других примеров фильтров можно привести команды cat и sort, тогда как ко
манды who, date, cd, pwd, echo, rrn, rnv и ер не являются фильтрами .
В дан ном примере сообщение " n o t found " (не найдено) факти чески направ
ляется командой ls в стандартный вывод ошибок. Чтобы убедиться в том, что
данное сообщение не направляется в стандартный вывод дан н ых, результат вы
полнения команды l s можно переадресовать в файл, как показано в при веден
ном ниже примере. Сообщение, как видите, по- прежнему выводится на терми нал
и не направляется в файл foo, несмотря на то, что стандартн ый вывод переадре
совывается.
$ ls n * > foo
n * not found
$
Обратите внимание на то, что пр обел между цифрой 2 и знаком > не допу
скается. Любые сообщения об ошибках, которые, как правило, направля ются в
стандартны й вывод ошибок, перенаправляются в указанный файл подобно пере
адресации стандартного вывода дан ных, как показано в следующем примере:
$ ls n * 2 > errors
$ cat errors
n * not found
$
В приведен ном выше при мере число 1 обозначает номер задания, а число 1258 -
идентификацион ный номер процесса. Номер задания служит в качестве сокра
щен ного варианта обращения к кон кретному фоновому заданию в некоторых ко
мандах оболоч ки (подробнее об этом - в главе 14). А идентифи кацион ный ' номер
процесса однозначно определяет команду, передан ную на выполнение в фоновом
режиме. С его помощью можно получить сведения о состоя нии команды, и это
делается по команде ps (т.е. состояние процесса).
Кома нда рs
Команда ps предоставляет сведения о процессах, выполняемых в системе.
Если эта команда вводится без дополнительных параметров, то она выводит толь
ко состоя ние процессов. Введя команду ps с терми нала, можно получить в итоге
несколько строк, описывающих вы пол няемые процессы, как показано в следую
щем примере:
$ ps
PID ТТУ T I ME CMD
13463 pts / 1 6 00 : 00 : 09 ba s h
19880 pts / 1 6 00 : 00 : 00 ps
$
С в одка ко м а нд
В табл. 1 .2 сведены все команды, рассмотрен н ые в этой главе. В данной та
бл ице фа йл обозначает указываемый файл, фа йл (ы) - оди н или несколько ука
зываемых файлов, ка талог - указываемы й каталог, ка талог (и) - оди н или
несколько указываемых каталогов, аргументы - заданные аргументы команды.
Табл и ца 1.2. С водка команд
cat файл (ы) Отобразить содержимое указанных файл (ов) , а если они не
указаны - стандартный ввод
cd ка талог Заменить рабоч ий каталог на указанный ка талог
ер файл, ф айл, Скопировать Файл, в файл,
ер файл (ы) жа талог Скопировать файл (ы) в жа талог
date Отобразить дату и врем я
echo арг;унен� Отобразить заданные арг;унен�
ln файл, ф айл, Св я зать файл, и файл,
ln файл (ы) ка талог Связать файл (ы) и жаталог
l s файл (ы) Перечислить файл (ы)
l s ка талог (и) Перечисл ить файлы, которые содержат указанные
жа талог (и) или текущи й каталог, если жа талог (и) не
указаны
mkdi r ка талог (и) Создать указанные жа талог (и)
mv файл, файл_, Переместить файл, в ф айл, (или переименовать файл, если
оба указанных файла находятся в одном и том же каталоге)
mv файл (ы) ка талог Переместить ф айл (ы) в указанный жа талог
ps В ывести списком сведения о б активных процессах
pwd Ото бразить путь к текущему раб очему каталогу
rm файл (ы) Удалить файл (ы)
rmdi r ка талог (и) Удалить пуст ь1е жа талог (и)
s o r t файл (ы) Отсортировать строки , которые содержат указанные
файл (ы) или стандартный ввод, если файл (ы) не указаны
wc файл (ы) Подсч итать кол ичество строк, слов и символов, которые
содержат указанные файл (ы) или стандартный ввод, если
файл (ы) не указаны
who Отобразить пользователей, зарегистрированных в системе
Н а з нач ение обол очки
Я д ро и утил иты
Система Unix логи чески разделяется на две области : ядро и утилиты (рис. 2. 1 ) .
А если угодно, то ее можно представить как ядро и все остальное, обыч но досту[]
ное через оболоч ку.
,-----------,
1 1
1
1 -
Я дро 1 -
�
системы � - Утилиты
1
Unix 1
- -
1
Диск и
1
_ _ _ _ _ _ _ _ _ _ _ _ J
Оперативная память
Рис. 2 . 1 . Система U n ix
И сходн ая обол оч ка
Прежде терми налы были физическими устройствами, напрямую подкл ючав
ш и мися к системе Unix. В настоя щее время терминальные программы дают поль
зователям возможность взаимодействовать с системой Unix по сети в управляе
мом окне, оставаясь в своей среде Linux, Мае OS или Wi11dows. Как правило, поль
зователь запускает на выполнение программу вроде Termi11al или xterm, а Затем
подключается к удален ным системам, используя такие служебные программы,
как s s h, te l ne t или r l o g i n.
Для каждого физического терм и нала в системе Unix активизи руется служеб
ная программа g e t t y. Этот процесс наглядно показан на рис. 2.2.
Ядро
системы getty
Unix
getty
введете свои учетные дан ные и нажмете клавишу < Enter>, программа l o g i n за
верш ит процесс входа в систему (рис. 2.3).
Ядро
системы getty
Uпix
getty
Рис. 2.3. Запуск служе б ной п рогра м м ы loqin на тер м и нале пол ьзователя sue
Когда программа l og i n нач и нает свое выпол нение, она отображает символь
ную строку Pa s s word : (Пароль:) и переходит в режим ожидания ввода вашего
пароля. Как тол ько вы введете свой пароль и нажмете клавишу < Enter> (при этом
вы не увидите введенный вами пароль из соображен и й безопасности) , программа
login перейдет к проверке достоверности введенного вами регистрацион ного
имени пользователя и пароля по соответствующей записи в файле e t c /pa s swd.
В этом файле содержатся записи, организуемые по учетной записи каждого поль
зователя, где, среди прочего, указано регистрацион ное имя, начальный каталог
и программа, запускаемая при входе пользователя в систему. И последн и й фраг
мент и нформации (исходная оболочка) сохраняется в каждой строке вслед за по
следним двоеточием. Если же вслед за последним двоеточием н ичего не следует,
то по умолчанию предполагается стандартная оболочка / Ь i n / sh.
Есл и вы входите в систему через терми нальную программу, в процесс обмена
данными с подтвержден ием может быть также вовлечена служебная программа
вроде s s h в вашей системе или s s hd на сервере. И если вы откроете окно в своей
системе Unix, то, скорее всего, сразу же войдете в систему, не вводя пароль снова,
что очень удобно.
Но вернемся к файлу пароля. Ниже приведены тип и ч н ые строки из файла
/etc /pa s swd для регистрации трех пользователей системы : sue, pat и ЬоЬ.
sue : * : 1 5 : 4 7 : : / u s e r s / s u e :
pa t : * : 9 9 : 7 : : / u s e r s / p a t : / b i n / k s h
ЬоЬ : * : 1 3 : 1 0 0 : : / u s e r s / da t a : / u s e r s / da t a / b i n / da t a _ e n t ry
62 Гл а в а 2. Н азначение о б олочки
Ядро
системы getty
Unix
getty
·- ---------------�
/usr/Ьin/sh
Ядро
системы
Unix
1_ ---------------�
Вв од ком а нд в оболоч ке
Когда оболочка запускается на выполнен ие, она отображает на терминале при
глашение командной строки - как правило, знак денежной единицы ( $ ) - и за
тем переходит в режим ожидания, когда пользователь введет команду (см. шаги 1
и 2 ци кла выполнения команд на рис. 2.6). Всякий раз, когда вы вводите команду
и нажимаете клави шу <Eпter> (шаг 3), оболочка анализирует то, что вы ввели, и
переходит к выполнению запроса (шаг 4).
Если вы запросите оболочку вызвать конкретную программу, она приступит к
поиску программы во всех каталогах на диске, указанных в переменной окруже
ния РАТН, до тех пор, пока не найдет указанную программу. Как только программа
будет найдена, оболочка создаст свою копию, называемую подоболочкой, и запро
сит у ядра заменить подоболочку указанной программой. Затем исходная оболочка
перейдет в режим ожидания до тех пор, пока не завершится запрашиваемая про
грамма (шаг 5). Ядро скопирует указанную программу в оперативную память и
приступит к ее выполнению. Эта копия программы называется процессом. Подоб
ным образом проводится различие между программой, хранящейся в файле на дис
ке, и процессом, находящимся в оперативной памяти и выполняемым построчно.
64 гл а в а 2. Назначение оболочки
1 Оболоч ка � --
1.
2. Э.
J
сЬ--
� - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5.
6. 8.
Следует, однако, признать, что оболочка является обыч ной служебной про
граммой . У нее нет н и каких привилеги й в системе, а это означает, что всякий
Обяза н н ости оболочки 65
В ыполнен ие п рограм м
Оболочка отвечает з а выполнение всех программ, которые запрашиваются
с терминала. Вся кий раз, когда вы вводите строку в оболоч ке, она анализирует
эту строку и определяет порядок дальней ших действи й. Что же касается самой
66 Гл а в а 2 . Назначение оболочки
L__J
games
она передаст команде e cho четыре аргумента: when, do, we и eat ? (рис. 2. 1 0).
Обяза н н ости оболочки 67
when
Р ис. 2.10. П роцесс выпол не ния кома нды echo с четырьмя а ргумента ми
При ни мая свои аргументы, команда e cho просто отображает их на терми нале,
и поэтому выделение каждого аргумента отдельным пробелом делает выводи мый
результат более удобоч итаемым:
S echo when do we eat?
when do we еа t_ ?
$
она распознает специал ьный символ * и подставляет имена всех файлов из теку
щего каталога (и даже автоматически расставляет их в алфавитном порядке):
echo rn r s . t odd p r og l s h o r t c u t s we e n e y
l.......J shor1cut
sweeney
Когда команда wc начинает свое выполнение, она на этот раз замечает, что ей
передан только один аргумент -1. А поскольку имя файла не указано, то к� манда
wc решает, что строки, количество которых следует подсчитать, должны посту
пать не из файла, а из стандартного ввода. Таким образом, команда wc - 1 под
считывает количество строк, даже не подозревая, что эти строки на самом деле
поступают из файла u s e r s . Конечный результат выполнения этой команды ото
бражается как обыч но, но без и мени файла, поскольку оно не было передано ко
манде wс.
Очень важно уяснить отличия в выполнении обеих рассмотренных выше ко
манд. Если эти отличия по каким-то причи нам вам не ясны, внимател ьно прочи
тайте этот раздел еще раз, прежде чем перейти к следующему разделу.
оболочка обнаружит символ канала, разделяющий команды who и wc. При этом
она подключает стандартный вы вод из первой команды к стандартному вводу
второй команды, а затем начинает выполнение обеих команд. В результате своего
выполнения команда who производит список зарегистрированных пользователей
и направляет его в стандартный вывод, даже не подозревая, что это не терми нал,
а другая команда.
А когда выполняется команда wc, то она выясняет, что имя файла не указано,
и поэтому подсчитывает строки из стандартного ввода, даже не подозревая, что
стандартный ввод поступает не с терминала, а следует из результата, выводимого
командой who.
Как станет ясно в дальнейшем, конвейер можно образовать не только из двух
команд, но из сложной цепочки, состоящей из трех, четырех, пяти или больше
го числа команд. И хотя это не легко уяснить поначалу, тем не менее, едва ли
не самый большой потенциал системы Unix кроется именно в конвейеризации
команд.
Обяза н ности о болочки 71
Контрол ь окружен ия
Оболоч ка предоставляет такие команды, которые дают вам возможность спе
циально настраи вать свое окружение. В это окружение обыч но входит ваш на
чальный каталог; символы, которые оболочка отображает, приглашая вас ввести
команду; а также список каталогов, который следует искать всякий раз, когда вы
запрашиваете выпол нение программы. Подробнее о контроле своего окружения
вы узнаете в главе 1О.
Р егул я р н ые в ы р а же н ия
Прежде чем рассматри вать инструменты для программирован ия на языке
оболоч ки, необходимо разъясн ить понятие регулярных вь1ражений. Регулярные
выражения применяются в самых разных командах системы Uпix, включая ed,
sed, awk, g rep, и в меньше степен и в редакторе vi. Они предоставляют удобный
и согласованный способ указания шаблонов для сопоставления.
Как ни стран но, но оболочка распознает ограниченную форму регулярных вы
ражен ий в подстановке имен файлов. Напомним, что знак звездочки ( * ) обозна
чает совпадение с нулевым или большим количеством символов, знак вопроса
( ? ) - с любым оди ночным символом, а конструкция [ . . . ] -с любыми сим
волами в квадратн ых скобках. Но подобные формы все же отличаются от более
формальных регулярных выражен ий, рассматриваемых в этой главе. Например,
оболоч ка интерпретирует знак ? как совпадение с любым оди ночным символом,
тогда как в регулярном выражении для этой цели служит знак точ ки ( . ).
Настоя щие регулярные выражен ия оказываются нам ного более сложными,
чем те их формы, которые распознаются оболочкой, и поэтому вопросам состав
ления по- настоя щему сложных регулярных выражен ий посвящены целые книги.
Впрочем, чтобы оценить исти н н ы й потенциал регулярных выражен ий, совсем не
обязано быть их знатоком !
В этом разделе предполагается, что вы знакомы с такими строковыми редакто
рами. как ех или ed. Более подробн ые сведения об этих редакторах можно найти,
обрати вш ись за справкой к соответствующей оперативной странице руководства
man по системе U11ix.
А регулярное выражение
. х .
Выше выведено содержи мое нашего рабочего файла. А теперь опробуем неко
торые регулярные выражения в следующем примере:
/ . . . / На й ти три симв ола , окруженные про бела ми
The U n i x ope r a t i n g s y s t em wa s p i on e e r e d Ьу Ke n
/ Пов торит ь по следний поиск
Thomp s o n and Denn i s R i t c h i e at Be l l Labo r a t o r i e s
1 , $ s /p . o/XXX/ g З аменить в се комбина ц ии симв олов р . о на ХХХ
1 , $р Посмотреть , что из э того вышл о
The U n i x ope r a t i n g s y s t em wa s XXXn e e r e d Ьу Ke n
T homXXXn and De n n i s R i t c h i e a t Be l l Labo r a t o r i e s
i n t h e l a t e 1 9 6 0 s . One o f t h e p r ima r y goa l s i n
t h e de s i gn o f t h e Un i x s ys tem wa s to c r e a t e a n
e n v i r o nme n t t h a t XXXmo t e d e f f i c i e n t XXX g r am
deve l opme n t .
(по команде / редактора ed) из файла выводится вторая строка, поскольку в ней
с указан ным шаблоном совпадает последовательность символов " and " .
В следующей далее команде подстановки s указывается, что все вхождения
символа р, после которого следует любой одиноч н ы й символ и далее символ о ,
должны быть заменены комби нацией символов ХХХ. Спецификатор 1 , $ , предва
ряющий эту команду, указывает н а то, что его следует применить ко всем строкам
в файле, а подстановка обозначается в виде структуры s/прежнее/нов ое/g, где
s - подстановка, знаки косой черты ограничивают прежнее и нов ое значения,
а g - применен ие дан ной операции в каждой строке не оди н раз, а столько раз,
сколько потребуется.
символы George совпадают лишь в том случае, если они оказываются в начале
строки. В терм и нологии регулярных выражени й это называется укоренением сле
ва по вполне очевидным причинам.
Рассмотрим следующий пример:
$ ed intro
248
/ the/
> > i n t h e l a t e 1 9 6 0 s . One o f t h e p r ima r y g oa l s i n
> > t he de s i gn o f t h e Un i x s ys tem wa s t o c r e a t e a n
/ " the/ На йтн строку , на чина ющуюся со слова th в
the de s i g n of t h e Un i x s ys tem wa s t o c r e a t e an
1 , $ s / " />>/ Вста вить зна ки >> в на чале каждой строки
1 , $р
> >The U n i x ope ra t i ng s y s t em wa s p i on e e r e d Ьу Ke n
> >Thomp s o n and Denn i s R i t ch i e a t Be l l Labo r a t o r i e s
> > i n t h e l a t e 1 9 6 0 s . One o f t h e p r ima r y g oa l s i n
> > t he de s i gn o f t h e Un i x s y s tem wa s t o c r e a t e a n
> >e п v i ronme n t t h a t p r omo t e d e f f i c i e n t p r o g r am
'
> >dev e l opme п t .
Совпадет ли с ним только знак точ ки в кон це строки? Нет, не совпадет. Напом
ним, что знак точки обозначает совпадение с любым сим волом, и поэтому с ним
совпадет любой символ в кон це строки, включая и знак точ ки.
Как же добиться совпаден ия с сами м знаком точки? В общем, если требуется
добиться совпадения с л юбыми символами , и меющими специальное назначение
в регулярном выражени и , их следует предварить знаком обратной косой черты
( \ ) , чтобы переопредел ить их специальное назначение. Например, со следующим
регулярным выражен ием:
\.$
T h e Un i x ope r a t i n g s y s t em w a s p i o n e e r e d Ь у Ke n
Thomp s on and De nn i s R i t ch i e a t Be l l L a b o r a t o r i e s
i n t he l a t e 1 9 6 0 s . One o f t h e p r i ma ry goa l s i n
the de s i gn o f t h e U n i x s y s t em w a s t o c r e a t e a n
e n v i r o nme n t t ha t p r omo t e d e f f i c i e n t p r og ram
deve l opme n t .
Обратите внимание н а то, что первая строка файла содержит также слово The
с теми же самыми символами, но оно начинается с прописной буквы Т. Регуляр
ное выражение для поиск слова the или The может быть создано с помощью на
бора с,и мволов, где знаки [ и ] служат для огран ичения сопоставляемого набора
символов. Напри мер, со следующим регулярным выражением:
[ tT ] he
Для совпадения с прописной буквой англ и йского алфавита подойдет такое ре
гулярное выражение:
[A-Z ]
t h e de s i g n o f t he * n i x s y s t em w a s t o c r e a t e a n
e n v i r o nme n t t h a t p r omo t ed e f f i c i e n t p r o g ram
deve l opme n t .
циального назначения в строке замены. Так, если знак вставки ( " ) оказывается
первым символом после левой (открывающей) квадратной скобки , то его смысл
меняется на обратный. (А в оболоч ке для этой же цели служит воскли цательный
знак ! , указываемы й вместе с наборами символов.) Например, со следующим ре
гулярным выражением:
[ "A- Z ]
совпадет любой символ, кроме проп исной буквы. Аналогич но с регулярным вы
ражением:
[ "A-Za- z ]
совпадает нуль, одна, две, три заглавн ые букв Х и больше, тогда как с регулярным
выражением
ХХ*
нередко служит для обозначения нулевого или большего коли чества вхождений
любых символов. Следует, однако, и меть в виду, что данное регулярное выраже
ние сопоставляется с самой длинной символьной строкой, совпадающей с указан
ным в нем шаблоном. Следовательно, само это вы ражен ие всегда сопоставляется
со всей строкой текста.
Регуля рные в ы ражения 81
$ ed intro
24 8
1 , $ s/ [A-Za- z 0 - 9 ] [A-Za- z0 - 9 ) * /X/g
1 , $р
х х х х х х х х
х х х х х х х
х х х х. х х х х х х
х х х х х х х х х х
х х х х х
х.
означает совпадение с буквой Х, после которой следует нулевое или большее ко
л ичество вхожден и й той же самой буквы Х. Аналогично регулярное выражение
ХХХ *
Но, откровенно говоря, это не очень удобно, и поэтому и меется более общий
способ указать точ ное количество совпадающих символов, используя следующую
конструкцию:
\ { m.in , шах\ }
где шin обозначает минимал ьное коли чество совпадающих вхождений пред
шествующего регулярного выражения, а .шах максимальное. Следует, однако,
-
совпадает от одной до десяти следующих подряд букв Х. Всякий раз, когда появ
ляется выбор, совпадение происходит с наибольшим шаблоном. Так, если вход
ной текст содержит восемь букв Х подряд, то именно с таким количеством букв и
произойдет совпадение в приведенном выше регулярном выражении.
В качестве еще одного примера рассмотрим следующее регулярное выражение:
[A-Za - z ] \ { 4 , 7 \ }
\ { 1 0\ }
десять сим волов, какими бы они н и был и, как показано в приведен ном ниже при
мере.
$ ed intro
248
1 , $s/ " . \ { 10 \ } // Удалить первые 10 симв ол о в из кажд ой строки
1 , $р
p e r a t i n g s y s t em w a s p i on e e r e d Ьу Ken
nd De nn i s R i t c h i e at Be l l Labo ra t o r i e s
е 1 9 6 0 s . One o f t he p r ima r y g o a l s i n
o f t h e Un i x s y s t em was t o c r e a t e a n
t t h a t p r omo t ed e f f i c i e n t p r o g ram
t.
1 , $s/ . \ { 5\ } $/ / Удалить по след ни е 5 симв олов из кажд ой строки
1 , $р
p e r a t i n g s y s t em w a s p i o n e e r e d Ь
nd De nn i s R i t c h i e a t Be l l Labo r a t
е 1 960s . One o f t h e p r ima r y g o a
o f t he Un i x s y s t em wa s t o c r ea
t that p r omo t e d e f f i c i e n t p r
t.
совпадет по меньшей мере пять следующих подряд знаков "плюс ': Если же во
входных дан н ых встречается больше пяти следующих подряд знаков "плюс", то
совпадение происходит с наибольшим их количеством. Ниже приведен характер
ный пример применения подобной конструкции.
Регулярн ые вы ражения 85
$ ed intro
248
1 , $s/ [a- zA- Z ] \ { б , \ } /X/q Заме нить н а бу кв у Х сл ов а ,
СОСТОЯЩJ tе х о тя бы нз 6 бук в
1 , $р
The U n i x Х Х wa s Х Ьу Ken
Х and Х Х at Be l l Х
in t h e l a t e 1 9 6 0 s . On e o f t he Х g o a l s i n
t h e Х o f t h e Un i x Х w a s t o Х a n
Х tha t Х Х Х
х.
нием:
"\ ( . \ ) \ 1
совпадают все строки, где первый символ ( ""' . ) такой же, к а к и последний ( \ 1 $ ) .
А шаблон . * означает совпадение с о всеми промежуточными символами.
Проанализируем данное регулярное выражение по частям. Напомним, что
знак ""' обозначает совпадение в начале строки, а знак $ в конце. В упрощен
-
ном виде шаблон * обозначает первый сим вол в строке ( первый знак . ), после
. .
86 l il a в a 3 . Ра бочие и нструменты
которого следует остальная часть строки ( . * ) . Чтобы сохран ить первый символ
в регистре l , вводится обозначение \ ( \ ) , а для ссылки на него - обозначение
\ 1 . Теперь вам должно быть ясно, каки м образом действует дан ное регулярное
выражение.
Если конструкция \ ( . . . \ ) следует несколько раз подряд, то совпавшие сим
волы по очереди сохраняются в соответствующих регистрах. Так, если для сопо
ставления с каким-нибудь текстом применяется следующее регулярное выра?Кение:
"\ ( . . . \) \ ( . . . \)
все, что совпадает вплоть до знака табуляции (Al i ce Chebba), сохраняется в ре
гистре 1 , а все, что совпадает после знака табуляции ( 9 7 3 - 5 5 5 - 2 0 1 5 ) ,
- в ре
гистре 2. Сам же знак табуляции при этом теряется, поскольку он не заключен
в круглые скобки в рассматриваемом здесь регулярном выражении. После этого
редактор ed заменяет совпавшие си мволы (т.е. всю строку) содержимым реги
стра 2 ( 9 7 3 - 5 5 5 - 2 0 1 5 ) , пробелом и содержимым регистра 1 (Al i ce Chebba).
И в конеч ном итоге получается следующая строка:
9 7 3 - 5 5 5 - 2 0 1 5 A l i ce Chebba
Окончание табл. 3. 1
Обозна ч ен ие Н а зн аче н и е П р и мер С че м совпада ет
К о м а нд а cu t
В этом разделе рассматривается очень полезная команда cut, которая очень
удобна для извлечения (буквально " вырезания") различ ных полей данн ых из
файла или результата, выводимого другой командой. Общая форма команды cut
выглядит следующим образом:
cut - с символы фа йл
где симв олы коли чество символов ( по местоположен и ю), которые требуется
-
извлечь из каждой строки, которую содержит указан ный фа йл. Этот набор сим
волов может состоять из одного числа, например, - с 5 для извлечения пятого
символа из каждой строки входных дан н ых; разделенного запятыми списка ч и
сел, например, - c l , 1 3 , 5 0 для извлечения символов 1 , 1 3 и 5 0 ; или ж е диапазона
чисел, указываемых через дефис, например, - с 2 0 - 5 0 для извлечения символов в
пределах от 20 до 50 включ ительно. Чтобы извлечь символ ы в конце строки, вто
рое число в указываемом диапазоне можно опустить. Так, по команде
cut - с 5 - da t a
Параметр -сl - 8 команды cut указывает на то, что из каждой строки входных
дан ных следует извлеч ь от 1 до 8 символов и направить их в стандартный вывод.
В следующем примере демонстрируется порядок присоединения команды
s o r t в конце конвейера из предыдущего примера с целью получ ить отсортиро
ван ный список зарегистрированных пользователей:
$ who 1 cut -cl - 8 1 sort
dawn
george
root
s t e ve
$
Параметры - d и -f
Команда cut с параметром -с удобна для извлечения дан ных из файла или
результатов выполнения другой команды, но при условии, что формат файла или
вывода из другой команды фиксирован.
В частности, командой cu t можно пользоваться вместе с командой who по
том у, что заранее известно, что и мена зарегистрированных пользователей ото
бражаются на пози циях 1 -8, терминалы - на позициях 1 0- 1 6, а время входа в
систему - на позициях 1 8-29. Но, к сожалению, не все данные настолько хорошо
организован ы!
Рассмотрим в качестве примера содержи мое следующего файла / e t c /pas swd:
$ cat /etc/pas swd
root : * : O : O : The Supe r U s e r : / : / u s r / b i n / k s h
c r on : * : l : l : C ron Da emon f o r pe r i od i c t a s k s : / :
b i n : * : J : З : T he own e r o f s y s t e m f i l e s : / :
uucp : * : 5 : 5 : : / u s r / s poo l / u u cp : / u s r / l i Ь / u ucp / u u c i c o
a s g : * : б : б : T he Own e r o f A s s i g n a Ы e De v i c e s : / :
s t e ve : * . : 2 0 3 : 1 0 0 : : / u s e r s / s t e ve : / u s r / b i n / k s h
o t h e r : * : 4 : 4 : Needed Ь у s e c u r e p r o g r am : / :
$
Файл / e t c /pas swd является главным местом, где содержатся имена всех
пользователей в системе. Он содержит и другие сведения, в том ч исле идентифи
каторы пользователей, пути к их начальным каталогам, а также имена программ,
запускаемых на выполнение при входе конкретных пользователей в систему.
Очевидно, что дан н ые в этом файле организованы не так хорошо, как в резуль
тате выполнения команды who. Следовательно, извлечь список всех пользовате
лей системы из этого файла не удастся по команде cut с параметром -с.
Но если проанализировать содержимое этого файла более внимательно, то
можно заметить, что поля в нем разделя ются двоеточ ием. И хотя эти поля от
личаются по дл ине от одной строки к другой, тем не менее, можно определить
положение знаков двоеточия, чтобы извлеч ь одно и то же поле из каждой строки.
Если данн ые разделяются кон кретным символом, то для их извлечен ия по
команде cut можно воспользоваться параметрами -d и - f. В частности, пара
метр :... d определяет разделитель полей, а параметр -f - одно или несколько из
влекаемых полей. И в таком случае для вызова команды cut служит следующая
форма:
cut -ddch a r - f поля файл
где dch a r - символ, разделяющий поля дан ных, а поля - извлекаемые поля,
которые содержит указанный файл. Номера полей нач и наются с 1 , и для обо
значения номеров полей может быть использован такой же тип формата, как и
прежде для позиций символов ( например, - f l , 2 , 8 , - f l - 3 , f 4 ) - - .
92 Гл ii в а з . Ра бочие инст рументы
Li z S tachiw 212
S u s a n Go l dbe rg
Tony I a n n i no 97
$
Но ведь это совсем не то, что нужно! А произошло это потому, что имена або
нентов отделяются от номеров телефонов символом табуляции, а не рядом про
белов. Что же касается команды cut, то символы табуляции считаются в ней как
один символ, если она применяется с параметром с Именно поэтому команда
- .
Al i ce Chebba
Ba rba ra S w i n g l e
Je f f G o l dbe rg
L i z S t ac h i w
S u s a n Go l dbe rg
Tony I an n i no
$
А как узнать заранее, что поля дан ных разделяются пробельными символами
или символами табуляци и ? С одной сторон ы, это можно сделать методом проб и
ошибок, как было показано ранее. А с другой стороны, можно ввести с терми нала
следующую команду:
sed -n 1 файл
Как следует из при веденного выше результата, имя каждого абонента отделя
ется от каждого номера телефона символом табуляции. Более подробно потоко
вый редактор sed рассматривается далее в этой главе.
94 Гл а ва З. Ра бочие инструменты
К о м а нда pas te
Команда pa s te является полной противоположностью команды cut. Вместо
разделения строк на части она собирает их вместе. Общая форма команды paste
выглядит следующи м образом:
pa s t e фа йлы
$ cat addresses
5 5 - 2 3 V i ne S t re e t , M i am i
3 9 Un i ve r s i t y P l a c e , New Yo r k
1 7 Е . 2 5 t h S t re e t , N e w Y o r k
3 8 Chauncey S t . , B e n s o n h u r s t
1 7 Е . 2 5 t h S t re e t , New Yo r k
$ paste names addresses numЬers
Tony 5 5 - 2 3 V i n e S t re e t , M i am i ( 307 ) 555-5356
Emanue l 3 9 Un i ve r s i t y P l a ce , New Yo r k ( 2 12 ) 555-3456
Lucy 17 Е . 2 5 t h S t re e t , New Y o r k ( 2 12 ) 555-9959
Ra lph 3 8 Chauncey S t . , Bensonhu r s t (212) 555-774 1
Fred 17 Е . 2 5 t h S t r ee t , New Yo r k ( 2 12 ) 555-004 0
$
Параметр -d
Если поля в выводимом результате не требуется разделять символами табуля
ции, то с помощью параметра d можно указать другой разделитель в следующем
-
формате:
- d ch a rs
где cha rs - один или нескол ько символов, употребляемых для разделения объ
единяемых строк. Это означает, что первый из переч исленных в списке cha rs
символов будет использоваться для отделения строк из первого файла, которые
объединяются вместе со строками из второго файла; второй символ - для отде
лен ия строк из второго файла от строк из третьего файла и т.д.
Если задано больше файлов, чем символов, переч исленных в списке cha rs,
команда pa s t e автоматически переходит в начало этого списка, выбирая оттуда
символы для разделения объединяемых вместе строк. В простейшей форме па
раметр -d указывает еди нственный символ для разделения всех объединяемых
полей в выводимом результате, как показано в следующем примере:
$ paste -d ' + ' names addresses numЬers
Tony+ 5 5 - 2 3 V i n e S t r ee t , M i a mi + ( 3 0 7 ) 5 5 5 - 5 3 5 6
Emanue l + 3 9 U n i ve r s i t y P l a ce , New Y o r k + ( 2 1 2 ) 5 5 5 - 3 4 5 6
Lucy+ 1 7 Е . 2 5 t h S t re e t , New Y o r k + ( 2 1 2 ) 5 5 5 - 9 9 5 9
Ra lph+ 3 8 C h a u n c e y S t . , B e n s o n h u r s t + ( 2 1 2 ) 5 5 5 - 7 7 4 1
Fred+ l 7 Е . 2 5 t h S t ree t , New Y o r k + ( 2 1 2 ) 5 5 5 - 0 0 4 0
Параметр - s
Параметр - s предписывает команде pas t e объедин ить вместе строки и з од
ного и того же файла, а не из разных файлов. Есл и же указан лишь оди н файл,
в результате будут объеди нены все строки из заданного файла, разделен ные
96 Гп а в а 3. Р а бо ч и е и нструменты
К о м а нд а s ed
Команда sed представляет собой программу, применяемую для редактиро
вания данных в канале или последовательности команд. Название команды sed
сокращенно обозначает потоковый редактор (stream editor). В отличие от стро
кового редактора ed, потоковый редактор sed нельзя употреблять в диалоговом
режиме, хотя их команды оди наковы. Общая форма команды sed выглядит сле
дующим образом:
s e d кома нда фа йла
где кома нда - это команда в стиле редактора ed, применяемая к каждой строке,
указанной в задан ном файле. Есл и же файл не указан, то предполагается стан
дартный ввод.
Применяя одну или несколько указанных команд к каждой строке исходных
дан ных, редактор sed направляет результаты в стандартный вывод. Рассмотрим
применение этого редактора на конкретном примере. Обрати мся снова к тестово
му файлу int ro:
$ c a t intro
The Un i x ope r a t i n g s y s t em wa s p i o n e e r e d Ьу Ken
Thomp s o n and De n n i s R i t c h i e at Be l l Labo ra t o r i e s
i n t h e l a t e 1 9 6 0 s . One o f t h e p r ima r y goa l s i n
t h e de s i gn o f t h e Un i x s y s t em w a s t o c r e a t e a n
e n v i r o nme n t t h a t p r omo t e d e f f i c i e n t prog ram
Команда sed 97
deve l opme n t .
$
Допустим, в этом файле требуется заменить все вхождения слова " Un i x " сло
вом " UN I X " . Это нетрудно сделать в редакторе sed следующим образом :
$ sed ' s /Unix/UNIX/ ' intro Заменить слов о l7nix на UNIX
The UN I X ope ra t i n g s y s t em wa s p i o n e e r e d Ьу Ken
Thomp s o n and De n n i s Ri t c h i e at Be l l Labo r a t o r i e s
i n t he l a t e 1 9 6 0 s . One o f t l1e p r ima r y g o a l s i n
the de s i gn o f the UN I X s y s t em was t o c r e a t e a n
e n v i ronme n t t h a t p romo t e d e f f i c i e n t p ro g r am
deve l opme n t .
$
А теперь допустим, что из резул ьтата выполнения команды who требуется из
влечь только имена файлов. Как вам должно быть уже известно, это можно, с од
ной стороны, сделать по команде cut следующим образом:
98 Гл а в а 3. Ра бочие и нструменты
$ who 1 cut - cl 8
-
root
ruth
s t e ve
pat
$
А с другой стороны, для удаления всех символов после первого пробела , обо
значающего конец имени пользователя, и до конца строки можно применить ре
гулярное выражение в редакторе s ed:
$ who 1 sed ' s / . * $ / / '
root
ruth
s t e ve
pat
$
П а ра метр -n
По умолчанию редактор sed направляет каждую строку в стандартный вывод,
изменяется ли она или нет. Но иногда редактором sed требуется воспользовать
ся для извлечения лишь конкретных строк из файла. Именно для этой цели слу
жит параметр -n, который сообщает редактору s ed, что по умолчанию не нужно
выводить любые строки. А в сочетании с командой р можно вывести те строки,
которые совпадают с указанным диапазоном или шаблоном. Например, вывести
только первые две строки из файла:
$ sed -n ' 1 , 2 р ' intro Выв ес ти толь ко п ервые 2 строки
The U N I X ope r a t i n g s y s tem wa s p i on e e r e d Ьу Ke n
Thomp s o n a n d De nn i s R i t c h i e a t Be l l L a bo r a t o r i e s
$
К о м а нда tr
Команда t r служит в качестве ф ильтра для преобразования символов и з стан
дартного ввода. Общая ф орма команды t r выглядит следующим образом:
t r и сходные символы целевые_ симв олы
_
x n v i ronmxn t t h a t p r omo t xd x f f i c i x n t p ro g r am
dx v x l opmxn t .
$
Входные данные команды tr должны быть переадресованы из ф айла i n t ro,
поскол ьку команда tr всегда предполагает получ ить свои входные данные из
стандартного ввода. Результаты преобразова н и я направляются в стандарт
ный вывод, не затрагивая первоначальн ый ф айл. Приводя следующий, более
практи ческий при мер, напом н и м о кон вейере, применявшемся для извлечения
имен ф айлов и начальных каталогов всех зарегистри рован н ых в системе поль
зователей.
$ cut -d : -fl , б /etc/pas swd
root : /
cron : /
Ьin : /
uucp : / u s r / s poo l / u u cp
asg : /
s t e ve : / u s e r s / s t e v e
other : /
$
root /
cron /
Ьin /
uucp / u s r / spoo l / u u c p
asg /
s t e ve / u s e r s / s t eve
o t he r /
$
В приведен ном выше при мере символ табуляции заключен в одиночные ка
вычки. И хотя он не отображается, можете нам поверить, что он присутствует.
Этот символ следует закл ючить в одиночные кавычки, чтобы исключ ить его син
таксиче ский анализ и удаление как лишнего пробела в оболочке.
Для обращения с непечатаемыми символами можно указать их восьмери чное
представление в команде tr, испол ьзуя следующую ф орму:
\ ппп
где ппп - восьмерич ное представление символа. Такой способ применяется не
часто, но его все же следует взять на вооружен ие, поскольку он удобен для пред
ставления непечатаемых символов.
102 Гл а в а 3. Ра бочие и нст рументы
Догадал ись? В данном случае проп исные буквы преобразуются в строчн ые, а
строчные - в проп исн ые.
Параметр - s
Указав параметр - s, можно "уплотнить" многие вхождения символов в целе
вые_ симв олы. Иными словам и, если заданные исходные_ символы содержат
нескол ько экземпляров отдел ьного символа, то после преобразования они заме
няются единственным экземпляром дан ного символа.
Так, в следующем при мере команда tr преобразует все знаки двоеточия в сим
волы табуляции, заменяя нескол ько символов табуляции одн им:
tr - s ' : ' ' \11 '
f i le t h a t con t a i n s а lot
of Ыank spaces .
$
104 ! л а в а з. Р а б очие и нструменты
Параметр -d
С помощью команды tr можно также удалить отдел ьные символы из потока
ввода. Для этой цели служит следующая форма команды t r :
t r -d и сходные симв олы
где л юбой символ, вкл ючаемый в исходные_ симв олы, будет удален из стан
дартного ввода. В следующем примере по команде t r с параметром -d из файла
i nt ro удаляются все пробелы:
$ tr - d ' ' < in tro
TheUN I Xope ra t i n g S y s t emwa s p i on e e r e dbyKen
Thomp s o n andDe n n i s R i t c h i e a t Be l l La b o r a t o r i e s
i n t h e l a t e l 9 6 0 s . O n e o f t he p r ima r ygoa l s in
t h e de s i gn o f t h e UN I X S y s t emwa s t o c r e a t e a n
e n v i ronmen t t ha t p romo t ede f f i c i e n tp r o g r am
deve l opmen t .
$
Вы, вероятно, уже сообразили, что той же самой цел и можно добиться и с по
мощью редактора sed, как показано ниже.
$ sed ' s / / / 9 1 intro
TheUN I Xope ra t i ng s y s t emwa s p i on e e re dЬyKen
Thomp s on andDenn i sR i t ch i e a t Be l l Labo r a t o r i e s
i n t h e l a t e l 9 6 0 s . O n e o f t he p r ima r ygoa l s i n
t h e de s i gno f t he U N I X s y s t emwa s t o c r e a t e a n
e n v i ronme n t t h a tp romo t ede f f i c i e n t p r o g r am
deve l opme n t .
$
Для системы Unix характерно наличие нескольких подходов к решению одной
и той же задач и. В рассмотренном здесь примере любой из приведенных выше
подходов (т.е. применение команды tr или s ed) вполне при годен. Тем не менее
в данном случае лучше выбрать команду t r , поскол ьку она выглядит более лако
нично и выполняется быстрее.
Кома нда tr 105
В табл. 3.4 приведены характерные при меры применения команды tr для пре
образования и удаления символов. Но следует и меть в виду, что ком анда tr ма
нипулирует только одиночными символами. Так, если требуется преобразовать
что-нибудь длин нее одного символа (например, все экземпляры слова uni x в
слово UN I X), для этой цели придется воспользоваться другой командой, напри
мер sed.
Табл ица 3.4. Характерные примеры применен и я команды tr
Команда tr Описание
Команда grep
Команда g rep дает возможность находить в одном или нескольких файлах
содержимое, совпадающее с указанным шаблоном. Общая форма команды g rep
выглядит следующим образом :
g rep ша блон фа йлы
Как было показано ранее при рассмотрении редактора sed, для вывода из
файла i n t ro всех строк, содержащих слово UN I X, достаточ но было выполн ить
следующую команду:
sed -n ' /UNIX/p ' intro
Если в данном файле требуется найти конкретный номер телефона, для этой
цели как нельзя лучше подойдет следующая команда grep:
$ grep Susan phoneЬook
S u s a n G o l db e r g 2 0 1-555-7 7 7 6
$
Команда g rep особенно удобна в том случае, если имеется много файлов и
требуется выяснить, в каком из них содержатся определенные слова или фразы. В
приведенном н и же примере демонстрируется применение команды grep для по
иска слова s he l l во всех файлах текущего каталога. Как отмечалось выше, если в
команде grep указано несколько файлов, каждая выводимая строка предваряет
ся и менем файла, в котором содержится эта строка.
$ grep shell *
cmd f i l e s : s he l l t h a t e n a Ь l e s soph i s t i c a t e d
ed . cmd : f i l e s , a n d i s i ndepende n t o f t h e s h e l l .
ed . cmd : t o t h e s he l l , j u s t t ype i n а q .
g rep . cmd : o c c u r rence o f t he word s h e l l :
g re p . cmd : $ g re p s he l l *
g rep . cmd : e ve r y u s e o f t h e word s he l l .
$
Кома нда tr 107
Но если закл юч ить знак звездоч ки в кавычки, он тем самым будет защищен от
си нтаксического анализа и интерпретации в оболочке. Н иже показано, как это
сделать в рассматри ваемом здесь примере.
$ grep ' * ' s tars
The a s t e r i s k ( * ) i s а spec i a l c h a r a c t e r t ha t
***********
5 * 4 = 20
s
108 Гл а в а З. Ра б оч ие и нструменты
Кавыч ки сообщают оболоч ке оставить без внимания заключен ные в них сим
волы. В таком случае оболочка запустит команду g rep на выпол нение, передав
ей два аргумента: знак * (без кавычек, которые попутно удаляются оболоч кой ), а
также имя файла s t a r s (рис. 3.2).
Однако, есл и файл для поиска не указан, команда g rep автомати чески про
смотрит стандартный ввод. Естествен но, что есл и пользователь j im не вошел в
систему, то вместо приведенного выш е результата в командной строке будет про
сто выдано при глашение:
$ who 1 grep j im
$
чтобы найти строч ную или проп исную букву t или Т, а вслед за ней - буквы he.
Чтобы переч ислить все строки из файла i nt ro, содержащие комби нацию
сим волов the или The, можно ввести следующую команду g rep:
$ qrep ' [ tT ] he ' intro
The UN I X ope r a t i n g s y s t em wa s p i o n e e r e d Ьу Ken
in t he l a t e 1 9 6 0 s . One of the pr ima r y goa l s i n
the de s i gn o f t h e UN I X s y s t em w a s t o c re a t e a n
$
Более изящный способ состоит в том, чтобы употребить в команде grep пара
метр i позволяющий составлять шаблоны без учета регистра. Так, по команде
-
,
Параметр - v
Иногда требуется найти строки, которые не содержат указанный шаблон.
Именно для этой цели и служит параметр -v команды g rep. В частности, он ме
няет на обратную логи ку совпадения с шаблоном. В следующем примере команда
110 Гл а в а 3 . Ра бочие и нструменты
grep применяется с параметром -v для поиска в файле i ntro всех строк, кото
рые н е содержат слово UN I X:
$ grep -v ' UNIX ' intro Вывести все строк11 ,
не содержащие слово UNIX
Thomp s o n and Denn i s R i t c h i e a t Be l l Labora t o r i e s
i n t h e l a t e 1 9 60 5 . One o f t h e p r i ma r y goa l s i n
e n v i ronme n t t h a t p romo t e d e f f i c i e n t prog ram
de ve l opmen t .
$
П а раметр - 1
Порой требуется выявить н е строки , совпадающие с шаблоном, а только и мена
файлов, содержащих этот шаблон. Допустим, в текущем каталоге находится ряд
программ на языке С ( имена и сходных файлов программ на С принято допол нять
расширением . с) и требуется выяснить, в каком из них применяется переменная
Move h i s tory. Решить эту задачу можно следующим образом:
_
следующей далее команде wc, чтобы подсч итать количество файлов, содержащих
указанный шаблон, как демонстрируется в следующем примере:
$ grep -1 ' Мove_history ' * . с 1 wc -1
3
$
h i s tory содержатся в трех исходных файлах. А теперь проверьте себя: что вам
удастся подсчитать, есл и вы введете команду g rep без параметра -1 и передадите
результат ее выполнения по каналу следующей далее команде wc - 1 ?
Параметр -n
$ grep -n ' Мove_h i s tory ' tes tch . c Пр едвари ть стр оки код а
их н омера ми
13 : GLOBAL MOVE Move h i s t o r y [ l O O ] = {Of;
_
1 97 : Move h i s t o r y [ NumЬ e r h a l f mo ve s - 1 ] . f rom
__ = move . f rom ;
_ _
198 : Mc ve h i s t o r y [ NumЬ e r ha l f mo ve s - 1 ) . t o move . t o ;
_
$
К ом а нда sort
В простей шем виде команду sort очень легко понять. Достаточ но предоста
вить ей строки исходн ых дан н ых, и она отсортирует их в алфавитном порядке,
выведя результат на терминал, как показано н и же. По умолчани ю команда s o r t
прин имает каждую строку из указан ного входного файла и сортирует е е по воз
растан и ю.
$ sort names
Ch a r l i e
Emanue l
Fred
Lucy
112 Гл а в а 3. Ра бочие и н струменты
Ra l p h
Tony
Tony
$
П а раметр -u
Параметр u предписывает команде s o r t исключ ить дубликаты строк из вы
-
В данном примере дубли кат строки с именем Tony искл ючен из резул ьтата,
выводимого командой s o r t . По тради ции многие пользователи системы Unix
выполняли ту же самую операцию, используя отдельную программу un i q, и если
просмотреть системные сценарии оболочки, то в них нередко можно обнаружить
команды вроде sort 1 u n i q. Теперь их можно заменить командой sort - u!
Параметр - r
Изменить порядок сортировки на обратный можно, указав параметр -r сле
дующим образом:
$ sort - r names Изменить порядок сорт11ров кн
Tony
Tony
Ra l ph
Lucy
Fred
Кома нда s o rt 113
Ema n ue l
C h ar l i e
$
Параметр -о
после него выходн ый файл, как показано ниже. В итоге отсортирован ное содер
жимое файла name s будет вы ведено в файл s o r ted name s .
$ sort names -о sorted names
$
то в конечном итоге содержи мое файла name s будет очищено! А с помощью па
раметра -о вполне допустимо указывать одно и то же имя как входного, как и
выходного файла в команде sort, как демонстрируется в следующем примере:
$ sort names -о naшes
$ cat names
Cha r l i e
Ema n ue l
Fred
Lucy
Ra lph
Tony
Tony
$
Со вет
Будьте в н и мател ьн ы , за меняя первоначал ь н ы й входной файл при фил ьтра ции , сорти ров ке
или иной о б ра ботке его содержимого. Не пременно убедитесь в правил ьности в ы пол нен и я
кон кретной опера ци и . п режде чем переза писывать исходные да н н ые. С
тме нистемалеUнп ix п редо
ставляет немало удобн ых средств . но в ней отсутствует кома нда о ы уда ия, чтобы
восста н овить потеря н н ые да н н ые ил и файлы.
114 Гл а в а З . Рабочие и нструменты
П а ра метр -n
Допустим, имеется файл, содержащий пары координат точек данных ( х, у) :
$ cat data
5 27
2 12
3 33
23 2
-5 1 1
15 6
1 4 -9
$
Допусти м также, что эти дан ные требуется предоставить программе построе
ния графиков под названием p l otdata. Но этой программе требуется, чтобы ис
ходные пары дан ных были отсортированы по возрастан ию значения координаты
х (т.е. первого значения в каждой строке).
Параметр -n команды s o r t обозначает, что первое поле в строке следует счи
тать числом, а дан н ые - отсортировать в алфавитном порядке. Сравн ите резул ь
тат выпол нения команды s o r t без параметра -n и вместе с ним в следующем
примере:
$ sort data
-5 11
14 -9
15 6
2 12
23 2
3 33
5 27
$ sort -n da ta О т сор тирова т ь в ари фме ти че ском п орядке
-5 11
2 12
3 33
5 27
14 -9
15 6
23 2
$
Параметр - t
Как упоминалось выше, если пропустить некоторые поля, команда s o r t пред
положит, что сортируемые поля разделяются символами пробела или табуляции.
Параметр - t позволяет указать и ное. В этом случае символ , указываемый после
параметра - t, принимается в качестве разделителя.
Рассмотрим снова в качестве примера файл пароля со следующим содержимым:
$ cat /etc/pas swd
roo t : * : O : O : The s upe r U s e r : / : / u s r / b i n / k s h
s t e ve : * : 2 0 3 : 1 0 0 : : / u s e r s / s t e ve : / u s r / b i n / k s h
b i n : * : 3 : 3 : The own e r o f s ys t em f i l e s : / :
cro n : * : l : l : C ron Daemon f o r pe r i od i c t a s ks : / :
g e o r ge : * : 7 5 : 7 5 : : / u s e r s / g e o r g e : / u s r / l i Ь / r s h
pa t : * : 3 0 0 : 3 0 0 : : / u s e r s / pa t : / u s r / b i n / ks h
uucp : nc 8 2 3 c i S i L i ZM : 5 : 5 : : / u s r / s poo l / uucppuЫ i c : / u s r / l i Ь / u u c p / u u c i co
a s g : * : б : б : The Owne r o f A s s i g n a Ы e De v i c e s : / :
s ys i n fo : * : l O : l O : Ac ce s s t o S y s t em I n f o rma t i o n : / : / u s r / b i n / s h
ma i l : * : 3 0 1 : 3 0 1 : : / u s r /ma i l :
$
Если этот файл требуется отсортировать по имени пользователя (т.е. первому
полю в 'каждой строке), с этой целью можно выдать следующую команду:
sort /etc/passwd
К о м а нда uniq
Командой un i q удобно пользоваться в тех случаях, когда в файле требуется
найти или удалить дубликаты строк. Ниже приведена общая форма команды
uniq.
u n i q входной_ фа йл вых одной_ фа йл
Fred
То п у
$
Как видите, имя Tony появляется в файле name s дважды. С помощью коман
ды uniq такие дубликаты записей в файле могут быть удалены следующим об
разом:
$ uniq names Выв е с т н од н о з н а ч ные с тро ки
Ch a r l i e
Топу
Ema п u e l
Lucy
Ra l p h
Fred
Tony
$
Но позвольте, и мя Tony так и осталось в приведенном выше результате, по
скольку несколько повторяющихся экземпляров записей следуют в файле не под
ряд. Следовательно, определение дубли катов строк в команде uniq оказывается
неудовлетворительным. В качестве выхода из этого положения зачастую приме
няется команда sort, чтобы получить расположенные рядом дубликаты строк,
как упоминалось ранее в этой главе. После этого результат сортировки передает
ся на обработку команде un i q, как показано ниже.
$ sort nam.es 1 uniq
Ch a r l i e
Ema п u e l
Fred
Lucy
Ra lph
Tony
$
Пара м етр -d
Зачастую требуется найти только дубли каты записей в файле. С этой целью
можно указать параметр -d, предписывающий команде un i q вывести только
дублирующиеся строки в указанный выходной_ файл (или направить их в стан
дартный вывод). Такие строки выводятся только оди н раз независимо от того,
сколько раз они повторяются, как демонстрируется в следующем примере:
$ sort nam.es 1 uniq -d Пере числи ть дублирующи еся строки
Топу
$
118 Гл а в а 3 . Ра бочие и нструменты
harry
$
Как следует из приведенного выше результата, в файле / e t c /pa s swd имеет
ся несколько записей с и менами пол ьзователей cem и ha r ry. Если же требуется
получить дополнительные сведения о кон кретных записях, их можно извлечь по
команде g rep из файла / e t c /pa s swd следующим образом:
$ grep -n ' cem. ' /etc/passwd
2 0 : c em : * : 9 1 : 9 1 : : / u s e r s / cem :
1 6 6 : cem : * : 9 1 : 9 1 : : / u s e r s / c em :
$ grep -n ' harry ' /etc/passwd
2 9 : ha r r y : * : 1 0 3 : 1 0 3 : H a r r y Jo hn s o n : / u s e r s / h a r r y :
7 9 : h a r r y : * : 9 0 : 9 0 : H a r r y John s o n : / u s e r s / ha r r y :
$
Д ругие п араметры
Указав в команде un i q параметр -с, можно подсч итать коли чество вхожде
н и й дан ных (строк или записей), что может быть очень удобно в сценариях. В сле
дующем при мере демонстрируется применение параметра -с в команде uni q:
$ sort names 1 uniq -с Под с чита т ь в х ожд е ния с тр ок
1 C h a r l ie
1 Emanue l
1 Fred
1 Lucy
1 Ra l p h
2 Топу
$
У команды uniq имеются еще два параметра, но для их описания здесь недо
статочно места. Упомянем л и ш ь, что с их помощью можно удалить начальные
символы или поля в строке. Более подробно ознакомиться с этим и параметрами
можно, обрати вшись за справкой к соответствующей операти вной стран и це ру
ководства по системе Unix, введя команду man uni q.
Было бы опрометч и во не упомянуть здесь команды awk и pe r l , которыми
удобно пользоваться для написан ия программ в оболочке. Но обе эти коман
ды сами по себе явля ются довольно крупными и сложными средам и програм
мирования. Поэтому для изучен ия команды awk рекомендуется руководство
Awk-A Pattern Scanning and Processing Language, Aho et а\., а ее описание можно
найти во втором томе Руководства по программированию в системе Unix (Unix
Programmer's Manua\, Volume 11). Неплохой справоч н ы й и учебный материал по
языку Perl можно найти в к н и гах Learning Perl и Prograттing Perl (издательство
O'Rei\ly and Associates; соответствующие издания обеих к н и г вышли в русском
переводе).
И та к , п ри с т уп им !
Изучив материал главы 2, вы должны теперь понимать, что, вводя всякий раз
команду вроде следующей:
who 1 w c - 1
К омандн ы е ф а йлы
Программа, выполняемая в оболочке, может быть введена непосредствен но,
как в следующем примере:
$ who 1 wc -1
или же набрана сначала в файле, а затем выпол нена из этого файла в оболочке.
Допустим, требуется выяснить количество пользователей, неоднократно вхо
дивших в систему в течение дня. С этой цел ью было бы неблагоразумно вводить
приведен ную выше конвейерную операцию всякий раз, когда требуется подобная
информация. Но ради примера наберем ее в отдельном файле nu, имя которого
сокращенно означает "количество пользователей':
Если обратиться к файлу nu, то окажется, что он содержит упомянутую выше
кон вейерную операцию:
$ cat nu
who 1 , wc -1
$
А для того чтобы выпол н ить команды из файла nu, достаточно ввести его имя
в качестве имени команды в оболочке следующим образом:
$ nu
sh : nu : c a n n o t e x e c u t e
(sh : nu : нельзя в ыполн1 1ть )
$
122 Гл а в d 4. Ита к . приступ и м !
- rw rw r
- - 1 s t e ve s t e ve 1 2 Ju l 1 0 1 1 : 4 2 nu
- -
Предуп режден и е
Есл и после разрешения воп росов. связа н н ых с права м и доступа . вы все равно получ ите
сообщение об ошибке "Coшmand not found" (Кома нда не найдена). поп робуйте ввести
знаки . / перед и менем файла (например . . /nu), чтобы оболочка искала этот командн ый
файл ка к в текущем каталоге команд. та к и в обыч ных местах систе м ы . А для того чтобы
исправ ить положение в дол госроч ной перспекти ве. можете ввести знак . в кон це пере
менной окружения РАТИ. которая обычно находится в вашем п рофил ьном файле с рас ш и
рением . profile.
Допустим, вы работаете над предложен ием в файле sys . caps и для вывода
этого предложения всякий раз требуется следующая последовательность команд:
tЫ sys . caps 1 nroff -mm -Tlp / lp
В командный файл s t a t s можно также ввести ряд команд echo, чтобы сде
лать выводимый результат более и нформативным, как показано ниже.
$ cat s tats
e c h o The c u r r e n t da t e a n d t i me i s :
da t e
e cho
e c h o The numЬe r of u s e r s o n the s y s t em i s :
who 1 wc - 1
echo
e c h o Y o u r c u r r e n t wo r k i n g d i r e c t o r y i s :
pwd
$ stats Выполни т ь кома ндный фа йл
124 Гл а в а 4. Итак. приступ и м !
T h e c u r r e n t da t e a n d t ime i s :
Wed Ju l 1 0 1 2 : 0 0 : 2 7 E DT 2 0 0 2
The nurnЬe r o f u s e r s on t h e s y s t e m i s :
13
You r c u r r e n t w o r k i ng d i r e c t o r y i s :
/ u s e r s / s t e ve / do c ume n t s / p r o po s a l s
$
Напомним, что команда e cho без аргументов выдает пустую строку. Далее бу
дет показано, как выводить сообщение и результат выполнения команды в одной
строке, как в следующем примере:
The c u r r e n t da t e and t ime i s : Wed Jul 1 0 1 2 : 0 0 : 2 7 E DT 2 0 0 2
Ком ментари и
П рограммирование на языке оболочки было бы неполноценным без оператора
комментариев. Комментарий - это способ ввести в исходном тексте программы
примечания или заметки, не оказывающие н и какого влияния на ее выполнения, а
только поясняющие ее н азначение.
Всякий раз, когда оболочка обнаружи вает специальный символ #, она и гнори
рует все, что следует после этого символа до конца строки. Если строка начина
ется с символа #, она полностью интерпретируется как комментарий. Ниже при
ведены примеры достоверных комментариев.
# Этот коммен т ари й за нима е т в сю строку
who 1 wc - 1 # п одс чи т а т ь коли ч е с т в о п ол ь з о в ателе й
#
# П р о ве ри т ь , пра в ил ь н о ли были п ре до с т а вле н ы а р г уме н т ы
#
echo
echo The n umЬ e r o f u s e r s on t h e s y s t e m i s :
who 1 wc - 1
e c ho
e c h o You r c u r r e n t wo r k i n g d i r e c t o r y i s :
pwd
$
Переменные
Подобно буквально всем языкам программирования, оболочка допускает хра
нение значен и й в переменнь1х. Имя перемен ной оболочки должно начинаться с
буквы или знака подчеркиван ия ( ), после чего следует нулевое или большее ко
личество буквенно- цифровых символов или знаков подчеркивания.
П ри меча н ие
Та ким образо м , регулярное выражение для обна ружен и я переменной оболочки должно вы
глядеть следующим образом:
[A- Za- z_ ] [ a - zA- Z 0 - 9_ ] *
Прежде всего обратите внимание на то, что пробелы п о обе стороны от зна
ка равенства не допускаются. Это обстоятельство необходимо и меть в виду осо
бенно тем, кто привык указывать операции присваивания с пробелами в других
языках программирования. А в языке оболочки н ичего подобно не разрешается.
126 Гл а в а 4. Ита к, п риступ и м !
Знак $ при н имает в оболочке специальное назначение, если после него следует
оди н или несколько буквен но-цифровых символов. Так, если после знака $ сле
дует имя переменной, оболочка воспринимает это как указание на то, что в пере
менной хранится значение, которое должно быть подставлено вместо ее имени.
Так, если ввести команду e cho $ count, оболочка заменит указанное имя пере
менной $ count хранящимся в ней значением и затем выполнит команду echo,
как показано ниже.
Командные фа йлы 127
$ echo $count
1
$
c::J"
count, а затем выполняет команду e cho, как показано на рис. 4.2.
_ _ _
•Е'!"'�""'- _ _
�use"/S1e.e/bl"
Рис. 4.2. П роцесс в ы пол нения команды echo $my_Ьin $count
Перемен ные можно указывать в любом месте командной строки. Они заменя
ются своими значениями в оболоч ке перед выполнением конкретной команды,
как демонстрируется в следующих примерах:
$ ls $my_Ьin
mon
nu
testx
$ pwd Ото бра з11ть те кущий ка талог
/ u s e r � / s t e ve / do c ume n t s /memo s
$ cd $my Ьin Перейти в ка талог Ьin
-
$ pwd
/ u s e r s / s t e ve / Ь i n
$ nWllЬer=9 9
$ echo There are $nWllЬe r Ьottles of Ьееr on the wal l
T h e r e a r e 9 9 b o t t l e s o f be e r o n t he wa l l
$
$ comшand=sort
$ $cOD1D1and naшes
Ch a r l i e
Emaпue l
Fred
Lucy
Ra lph
Топу
Т опу
$ comшand=wc
$ option=- 1
$ f"ile=names
$ $comшand $option $f"ile
7 п ame s
$
Как видите, в переменной можно хранить даже имя команды. Оболоч ка под
ставит его, прежде чем определит имя исполн яемой команды и ее аргументы, и с
этой целью она произведет си нтакси ческий анализ следующей командной строки:
$command $option $f"ile
Но на практике лучше указать пару кавычек сразу после знака равенства сле
дующим образом:
dataflag= " "
Так или иначе, перемен ной da ta f l ag будет присвоено пустое значение. Это
более наглядн ый способ намеренного присваивания пустого значения перемен
ной, чем предыдущий способ, который может быть вполне воспринят как ошибка
или опечатка.
130 Гл а в а 4. И та к, п риступ и м !
или же оболочка выполнила подстановку при выполнении при веден ной ниже ко
манды?
echo $х
echo $х
$х
•
addresses
intro
c::J·
lotsaspaces
names
- - !'!."!"."""'- - -
nu
numЬers
phonebook
stat
$ 1
$ echo $а
1 Те перь переменна я а содержит з на чение 1
$
Если требуется выполн ить присваивание без команды e cho или какой -нибудь
другой, эту операцию можно указать до арифметического расширения. Напри
мер, чтобы умножить значение перемен ной i на 5 и присвоить полученный ре
зультат обратно перемен ной i, достаточно написать следующую строку:
i=$ ( ( i * 5 ) )
Обратите внимание на пробелы в двой ных скобках, хотя они совсем не обя
зательны. Но есл и присваи вание выполняется за пределами двой ных скобок, то
пробелы в этой операции не допускаются.
Ниже приведено более лакон ич ное и чаще употребляемое обозначение состав
ной операци и умножения на 5 и присваивания полученного результата обратно
переменной i. Такое обозначение составной операции можно употребить и в дру
гом операторе.
$ ( ( i *= 5 ) )
Если требуется лишь прибавить 1 к значен ию перемен ной, это можно сделать
более лакон ично:
$ ( ( iн ) )
134 Гл а в а 4. Ита к. приступ и м !
Од и ноч н ая ка в ы ч ка
Для употребления кавычек в оболочке и меются самые разные причины. Чаще
всего их используют для составлен ия в един ы й элемент последовательности сим
волов, вкл ючая пробелы. В качестве примера рассмотрим снова файл phoneboo k,
содержащий имена абонентов и номера их телефонов:
$ cat phoneЬook
A l i c e C h e bba 973-555-2 0 1 5
Ba rba r a S w i ng l e 20 1-555-9257
L i z S tachiw 2 12-555-2298
S u s a n G o l db e r g 201-555-7776
S u s a n Topp l e 2 1 2-555-4 932
Tcny Iann ino 973-555-1295
$
В дан ном файле обнаруживаются сведения о двух абонентах по имени Sus an,
и поэтому в выводимом результате появляются две строки. Но допустим, что тре
буется получить сведения об абоненте Susan Go ldbe rg. С этой целью можно,
например, попробовать уточн ить имя абонента, дополнив его фамилией:
$ grep Susan GoldЬerg phoneЬook
g re p : ca n ' t open Go l dbe r g
S u s a n Go l db e r g 2 0 1 - 5 5 5 - 7 7 7 6
S u s a n Topp l e 2 1 2 - 5 5 5 - 4 9 3 2
$
Как видите, такой прием не действует. Дело в том, что пробелы служат в обо
лочке для разделения аргументов команды. А приведенная выше командная стро
ка интерпретируется как команда g rep с тремя аргументами Sus an, Go ldЬerg
и phonebook (рис. 5. 1 ).
Susan
Е] -С - - _аЕ1!�е__н�ы_
grep - - - Goldberg
1------
p h o n e bo o k
�-с- _ _ар�е_н�l>!_ _ _
s_u_
_
s_
an__o l_
G_ db
_e_r_
g
_
� phonebook
four
Р ис. 5.3. Процесс вы полнения ком а нды echo one two three four
Даже нажатие клавиши <Enter> сохраняется как составная часть аргумента ко
манды, если оно заключено в оди ночные кавычки:
$ echo ' How are you today ,
> John '
How a r e you t od a y ,
John
$
После си нтакси ческого анализа первой строки в дан ном примере оболоч ка не
обнаружит парную закрывающую кавычку и поэтом у выдаст пользовател ю при
глашение (>) на ввод закры вающей кавычки. Приглашение > называется вспомо
гательным и отображается оболочкой всякий раз, когда ожидается завершение
ввода м ногостроч ной команды.
Д войные ка в ы чки 139
Двой н ы е ка в ы ч ки
Двой ные кавычки действуют таким же образом, как и оди ноч ные, за исклю
чен ием того, что он и в меньшей степен и защищают свое содержимое. Если оди
ноч ные кавычки предписывают оболоч ке и гнорировать все заключенные в н их
символы, то двой ные кавычки - и гнорировать большую их часть. В частности,
следующие три сим вола не игнорируются в двойных кавычках.
• Знаки денежных единиц.
• Знаки обратных кавычек.
• Знаки обратной косой черты.
Тот факт, что знаки денежных един и ц не и гнорируются в двойных кавыч ках,
означает, что вместо имени переменной оболочка подставляет в двойных кавыч
ках значение этой переменной, как демонстрируется в следующем примере:
$ filel i s t=*
$ echo $fi lel i s t
addre s s e s i n t r o l o t s a s pa c e s name s n u n umЬ e r s phoneboo k s t a t
$ echo ' $ fileli s t '
$filelist
$ echo "$fi lel i s t "
s
140 Гл а в а 5. За кл ючение в ка вычки
П р и меч а н ие
Обсуждая отл и ч и я оди ноч ных кавычек от дво й н ых, следует та кже и меть в виду, что о болоч ка
не распознает парные ка в ыч ки " и " , форм и руем ые та к и м и текстовы м и редактора м и , как
M icrosoft Word , с цел ью придать на б ра нному тексту б олее п р и влекател ьн ы й вид при печати .
Но дел о в том , что употре бление парных кав ычек нарушает нормал ьную работу сценариев
оболочки , и поэтому их следует всячески избегать !
выполнения команды:
echo one two three four
Двой н ые ка в ы ч ки 141
Оболочка удаляет символы пробела, табуляции и новой строки (т.е. все про
бельные символы) из командной строки , а затем разделяет ее на аргументы, пре
жде чем передать их запрашиваемой команде. Поэтому в резул ьтате вызова сле
дующей команды:
echo $address
оболочка подставляет значение перемен ной addre s s, как и прежде, н о в дан ном
случае двойные кавычки предписы вают ей оставить без внимания любые заклю
ченные в них пробелы. Таким образом, оболочка передаст команде echo един
ственный аргумент, содержащи й си мвол новой строки. И команда e cho отобра
зит св0й единственный аргумент. На рис. 5.6 этот факт отображает комбинация
символов \ n, обозначающая новую строку.
Рис. 5.6. П роцесс в ы пол нени я кома нды echo 11 $ addres s "
142 Гл а в а 5. Заключение в ка в ыч ки
В первом случае, обнаружи в символ >. оболочка посч итает, что результат вы
полнения команды e cho следует переадресовать в файл, и поэтому она ожидает
обнаружить далее имя файла. А поскольку имя файла отсутствует, оболоч ка вы
дает сообщение об ошибке. А во втором случае знак обратной косой черты экра
нирует символ >. отменяя его специальное н азначение, и поэтому он передается
команде e cho для последующего отображения.
В приведенном ниже примере оболочка проигнорирует знак $ , следующий по
сле знака обратной косой черты, и в конеч ном итоге подстановки значения вме
сто и мени переменной не произойдет.
$ х-*
$ echo \ $х
$х
$
Обратная косая черта 143
В связи с тем что знак обратной косой черты отменяет специальное назначе
ние следующего после него символа, нетрудно догадаться, что произойдет, если
этим символом окажется еще оди н знак обратной косой черты: он отменит специ
альное назначен ие знака обратной косой черты, как показано ниже.
$ echo \\
\
$
Когда знак обратной косой черты указывается последним во вводи мой строке,
оболочка интерпретирует его как знак продолжен ия строки. В этом случае она
удаляеr:п следующий далее знак новой строки , не интерпретируя его как разде
литель аргументов, будто бы он вообще не был набран. Подобная конструкция
нередко применяется для ввода дли н н ых команд в нескольких строках.
Например, следующая операция присваивания впол не допустима:
Long i n pu t = " T h e s h e l l t r e a t s а b a c k s l a s h t h a t ' s t he \
l a s t cha r a c t e r o f а l i n e o f i n p u t a s а l i ne \
co n t i n ua t i o n . I t remo ve s t h e ne w l i n e t oo . "
144 Гil а в а 5. Заключение в ка в ы ч ки
Если попытаться теперь отобразить эту строку без кавычек, оболочка выдаст
сообщение о си нтаксической ошибке, как показано ниже. Ведь знак < указывает
оболочке на переадресацию, но после него не следует имя ф айла, и поэтому обо
лочка выдает сообщение об ошибке.
$ echo <<< echo $х >>> di splays the value of х , which i s $х
s yn t a x e r r o r : ' < ' u n e x pe c t e d
$
Подстановка кома нд 145
Есл и заключ ить всю упомянутую выше строку в оди ночные кавычки, значен ие
перемен ной х не будет подставлено в конце данной строки. А если заключить всю
эту строку в двой ные кавычки, то значение переменной х будет подставлено вме
сто обоих экземпляров $х. Коварная ситуация!
Ниже приведены два способа правильно заключить строку в кавычки, чтобы
добиться желаемого результата.
$ echo "<<< echo \ $х >>> displays the value of х , which is $х "
< < < echo $х > > > d i s p l a y s t h e va l u e o f х , wh i c h i s 1
$ echo ' <<< echo $х >>> di splays the value of х , whi ch i s ' $х
< < < echo $ х > > > d i s p l a y s t h e va l u e o f х , wh i c h i s 1
$
В первом случае вся строка заключается в двой ные кавычки, а знак обратной
косой черты служит для того, чтобы предотвратить подстановку значения пере
менной х вместо первого экземпляра $ х. А во втором случае строка заключается
в одиночные кавы чки вплоть до второго экземпляра $ х, добавляемого как пере
менная без кавычек, вместо имени которой следует подставить ее значение.
Но последн ий способ заключения в кавычки таит в себе следующую едва за
метную опасность: если переменная х содержит подстановку имени ф айла или
символы пробела, он и будут интерпретированы. Поэтому рассматриваемую здесь
команду e cho надежнее написать следующим образом:
echo ' <<< echo $х >>> displays the value of х , which i s ' " $ х "
П одста н ов ка ко ма нд
Подстановка команд означает для оболоч ки возможность заменить указанную
команду резул ьтатом ее выполнения в любом месте командной строки. Выпол
нить подстановку команд в оболоч ке можно двумя способами: заключив команду
в обратн ые кавычки или введя ее в конструкцию $ ( . . . ) .
Обратн ые кав ы ч ки
В отличие от всех упоминавшихся ранее типов кавычек, назначение обратных
кавыче� состоит не в том, чтобы защитить символы от и нтерпретации в оболочке,
но предписать ей заменить заключенную в них команду результатом ее выполне
ния. Общая форма применен ия обратных кавычек выглядит следующим образом:
кома нда
П р и меча н ие
Употребл ять обратн ые ка вычки дnя подстановки команд бол ьше не рекомендуется . Тем не
менее м ы рассматриваем такой спосо б подста новки ком а нд потому, что он применяется в
бол ь шом кол ичестве п режн и х сценариев о болочки . Кроме того , о возмож ностях обратных
ка вычек следует знать на тот случ а й , есл и п ридется п исать п рогра м м ы о б олочки , перено
симые в прежние версии систем U п ix с о болочка м и , где не поддержи вается новая и более
п редпочтител ьная конструкция $ ( . . . ) .
Конструкция $ ( ) . . •
где кома нда - это, как и в обратных кавычках, имя команды, стандартный вывод
из которой подставляется в командной строке. Рассмотрим следующий пример:
$ echo Тhе date and time i s : $ (date)
T h e da t e and t i me i s : Wed Aug 2 8 1 4 : 2 8 : 4 3 E DT 2 0 0 2
$
Подста новка команд 147
П р имеч а ние
Начальн ые п робел ы , получ а ющиеся в резул ьтате вы полнения команды wc в приведенном
вы ше при мере , неизменно вызыва ют досаду у п рогра м м истов . П оп ро б уйте на йти спосо б
изба виться от них с помощью кома нды sed.
148 Гл н в а 5. Заключение в кав ы ч ки
Что же здесь произошло? В конеч ном итоге в одной строке был выведен пе
речень всех файлов из текущего каталога, хотя знаки новой строки из команды
l s были сохранены в перемен ной f i l e l i s t. Эти знаки были поглощены при
отображении значения переменной f i l e l i s t, подставлен ного оболочкой в про
цессе обработки командной строки e cho. Знаки новой строки можно сохранить,
если заключить перемен ную f i l e l i s t в двойные кавычки, как в следующем
примере:
$ echo " $ fi lel i s t "
addre s s e s
i n t ro
l o t s a sp a c e s
name s
nu
numЬe r s
p h o n e bo o k
stat
$
Обратите внимание на то, что адресат Tony может получить одно и то же по
чтовое сообщение дважды, поскольку он два раза перечислен в файле name s .
Чтобы устранить любые дублирующиеся записи из файла, вместо команды c a t
можно воспользоваться командой s o r t с параметром -u, удаляющим дубли каты
строк, как показано ниже. В итоге каждый адресат получит почтовое сообщение
только ОДИ Н раз.
$ mail $ ( sort -u names ) < memo
$
Напомним, что оболочка выпол няет подстановку и мен файлов после подста
новки команд. Заключив команды в двойные кавычки, можно исключить подста
новку имен файлов при выводе результатов.
Подстановка команд нередко применяется с целью изменить значение, храня
щееся � перемен ной оболочки. Так, если перемен ная оболочки name содержит
чье-то имя, где все буквы требуется сделать проп исными, для этого можно вос
пользоваться командой echo, чтобы передать переменную name на вход команды
t r, выполнить преобразование, а затем присвоить результат обратно переменной
name, как показано ниже.
$ name="Ralph Кramden "
$ name=$ ( echo $name 1 tr ' [ a- z ] ' ' [A- Z ] ' ) Пр ео бра зова ть
в пропи с ные буквы
$ echo $name
RA L P H KRAMDEN
s
150 Гл а в а 5. Заключение в ка вычки
Если вам трудно понять при веденный выше пример, сравн ите его с предыду
щим при мером, обратив внимание на то, что перемен ная f i r s tcha r заменена
в нем вложенной подстановкой команд. А в остальном оба примера оди наковы.
Команда expr
Несмотря на то что в стандартной оболочке поддержи ваются встроенные це
лочислен н ые арифметические операции, в прежних оболочках такая поддержка
отсутствует. В таком случае может пригодиться команда expr для решен ия мате
матических уравнен ий:
$ expr 1 + 2
3
$
Команда expr проста в обращен ии, но она не вполне пригодна для си нтакси
ческого анализа уравнен ий. Поэтому каждую операцию и операнд, указываемые
в команде expr, необходимо отделять пробелами для правильной их интерпрета
ции. Это обстоятел ьство поясняется в следующем примере:
$ expr 1+2
1+2
$
Естествен но, что аргументами команды expr могут служить значения, храня
щиеся в перемен н ых оболочки, которая берет на себя обязанность заблаговре
менно подставить их:
$ i=l
$ expr $i + 1
2
$
чтобы указать имя файла new . h i re для обработки с помощью данной последо
вательности команд, или же таким образом :
run sys . caps
$ cat run
tЫ $ 1 1 n ro f f -пun -Tlp 1 lp
$
$ run new . hire Вып олни ть с именем ф а йла neW'. hirв
в ка че ств е аргумента
reque s t id i s l a s e r l - 2 4 ( s t a nda r d i np u t )
$
Всякий раз, когда выполняется программа run, все, что набрано после ее име
ни в командной строке, сначала сохраняется оболочкой в первом позиционном
параметре, а затем передается самой программе. Так, в приведен ном выше при
мере имя файла new . hi re сохраняется в этом параметре.
Подстановка позицион ных параметров осуществляется таким же образом, как
и подстановка других типов перемен ных. Следовательно, когда оболоч ка обнару
живает команду
tЫ $ 1
П е ре м е н н ая $#
Помимо пози ционных параметров, в оболочке имеется специальная перемен
ная $ # , при н имающая ряд аргументов, набранных в командной строке. Как будет
показано в следующей главе, содержимое этой переменной нередко проверяется
в программах на правильность количества аргументов, указан ных пользователем.
В следующем примере демонстрируется программа args, написан ная с един
ственной с целью - показать, каким образом аргументы передаются программе
оболочки. Внимательно проанализируйте каждый результат ее выполнения, что
бы хорошо понимать, как она действует.
Переме н ная $* 157
П ере м е н на я $ *
'
3 a rgume n t s p a s s e d
t h e y a re : а Ь с :
$ args2 one two
2 a rg ume n t s p a s s e d
t h e y a re : one two :
$ args2
О a rg ume n t s p a s s e d
t h e y a re : :
$ args2 *
8 a r g ume n t s p a s s e d
t h e y a re : a r g s a r g s 2 n ame s n u phoneboo k s t a t x a c t x t r a :
$
П р о гр а м м а для п о и с ка а б о н енто в
в телефо н н ом сп р а воч н и ке
Н и же приведено содержимое файла phoneboo k из предыдущих примеров.
$ cat phoneЬook
A l i c e Chebba 973-555-2 0 1 5
Barbara Sw i n g l e 201-555-9257
Liz Stachiw 2 12-555-22 98
S u s a n Go l d b e r g 2 0 1 -555-7 7 7 6
S u s a n Topp l e 2 12-555-4 932
Tony I an n i n o 973-555-1295
$
g r e p $ 1 phonebo o k
$
Програ м м а дл я поиска абонентов в телефонном с п равоч н и ке 159
$ cat add
#
# В вести н о во г о а б о н е н та в телеф о н ньm с п р а в оч ни к - верси я 2
#
В главе 7 будет показано, как проверять действие прежде, чем выполнять его,
чтобы в рассматриваемом здесь примере программы можно было определить
факт обнаружения не одной, а нескольких совпадающих записей. Но в програм
ме может, например, возникнуть потребность известить пользователя об обна
ружении нескольких совпавших записей вместо слепого их удаления. (Это было
бы очень удобно, поскольку в большинстве реализаций команды g rep произой
дет совпадение со всем, что угодно, если в качестве шаблона передать ей пустую
символьную строку. По существу, это привело бы к удалению всего содержи мого
файла phoneboo k, что было бы неверно!)
Между прочим, совпавшую запись можно было бы удалить и по команде sed.
В таком случае команду g rep можно было бы заменить следующей командой :
s e d " / $ 1 / d " phoneboo k > / tmp / p honeboo k
Ком анда shift 163
Конструкци я $ { п }
Если предоставить программе больше девяти аргументов, то десятый и после
дующие аргументы ( $ 1 0, $ 1 1 и т.д.) окажутся недоступными. И если поп ытаться
получить доступ к десятому аргументу по ссылке $ 1 0, то оболочка фактически
подставит значение аргумента $ 1 , а затем значение О. Вместо этого следует вос
пользоваться конструкцией $ { п } . Так, чтобы получить непосредствен ный до
ступ к десятому аргументу, следует указать ссылку $ { 1 О } в своей программе и
так далее для оди н надцатого, двенадцатого и остальных аргументов.
К оманда shi f t
Эта команда позволяет, п о существу, смещать влево позиционные параметры.
Есл и выполнить команду s h i ft, предыдущее значение позиционного параметра
$2 будет присвоено позиционному параметру $ 1 , а предыдущее значение пози
ционного параметра $ 3 позиционному параметру $2 и т.д. В то же время преж
-
5 а ь с d е
4 ь с d е
з с d е
2 d е
1 е
о
$
164 Гл а в а 6 Передача аргументов
где prog имя программы, в которой была выполнена команда s h i ft, а bad
-
дает такой же результат, как и выполнение подряд трех команд s h i ft без аргу
ментов:
shi ft
shi ft
shi ft
fi
где кома нда , выполняемая команда и проверяемый код е е завершен ия. Так,
-
если код завершения равен нулю, выполня ются команды, указан ные в промежут
ке между операторам и then и f i , а иначе эти команды пропускаются.
К од за вершен и я
Чтобы понять принцип действия условного оператора, важно знать, каким об
разом в системе Unix обрабатывается так называемый код завершения. Всякий
раз, когда программа завершает свое выполнение, она возвращает оболочке со
ответствующий код завершения. Условно нулевой код завершения обозначает
удачный исход выпопнения программы, а ненулевой код завершения - неудач
ный исход, причем разные значения кода завершен ия обозначают разные виды
неудачного исхода.
Неудачный исход может быть обусловлен тем, что программе переданы недо
стоверные аргументы или в ней обнаружено ошибочное условие. Напри мер, ко
манда ер возвращает ненулевой (сбой ный) код завершения, есл и копия оказыва
ется неудачной ( например, если нельзя найти исходн ый файл или создать целевой
файл) или же если аргументы указаны неверно ( напри мер, неверное кол ичество
аргументов или больше двух аргументов, последн и й из которых не является ка
талогом).
Что же означает ненулевой код завершен ия? Он означает любое целоч ислен
ное значен ие, не равное нулю. На больши нстве операти вных страниц руковод
ства по командам системы U11 ix перечисля ются и возможные коды завершения.
Так, возможными ошибочными условиями завершения команды копирования
166 Г м ш а 7 . В ы б ор по условию
Переме н ная $ ?
В перемен ной $ ? оболочка автоматически устанавли вает код завершения ко
манды, выпол нявшейся последней. Естественно, что для вывода значения этого
кода на терминал можно воспользоваться командой e cho, как показано ниже.
Следует, однако, заметить, что числовой результат "сбоя" в некоторой команде
может изменяться при переходе от одной верси и Unix к следующей, но удачный
исход всегда обозначается нулевым кодом завершения.
$ ер phoneЬook phone2
$ echo $ ?
о "Уда чный " исх од ко пиро ва ния
$ ер nosuch Ьackup
ер : c a n n o t a c ce s s n o s uch
$ echo $ ?
2 "Неуда чньл1 " исход копиров а н ия
$ who Выяснить , кто заре ги стрирова н в си стеме
root con s o l e Ju l 8 1 0 : 06
w i lma t ty03 Ju l 8 12 : 36
barney t ty04 Ju l 8 1 4 : 57
be t t y ttyl5 Ju l 8 1 5 : 03
$ who 1 grep barney
barney t ty04 Ju l 8 1 4 : 57
$ echo $ ? Вывес ти код за в ершения п оследней
кома нды (grep)
о "Уда ч ный " 1 1 сх од выполнения кома нды grep
$ who 1 grep fred
$ echo $ ?
1 "Неуда чНЫJ1 " исх од выполнения кома нды grep
$ echo $ ?
о Код за в ершения послед не й кома нды echo
$
Код за вершения 167
Поэтому шаблон необходимо огранич ить и справа. Если учесть, что и м я каж
дого пользователя выводится по команде who с одн и м или двумя пробелами, то
приведенный ниже видоизмененный шаблон обеспечит совпадение только с теми
строками, где и меется указанное имя пользователя.
" л $user "
К о м а н да te s t
Несмотря на то что для проверки условия в операторе i f из предыдущего при
мера программ ы применялся кон вейер, для проверки одного или нескольких ус
ловий намного чаще употребляется встроенная в оболочку команда t e s t. Ниже
приведена общая форма этой команды.
t e s t выражение
Строковые операции
В качестве примера ниже приведена команда, возвращающая нулевой код
завершения, если переменная оболоч ки name содержит си мвольную строку
" j ul i o " .
t e s t " $ name " = j u l i o
Операция = служит для проверки равенства двух значени й . В дан ном случае
проверяется, равно ли содержимое переменной оболоч ки name символьной стро
ке " j u l i o " . Если такое равенство подтверждается, команда te s t возвращает
нулевой код завершения, а и наче - ненулевой код завершения.
Следует, однако, иметь в виду, что все операнды (name и j ul i o) и операции
(=) должны быть доступны команде t e s t в качестве отдельных аргументов. Это
означает, что они должны быть разделены одни м или несколькими символами
пробела.
Вернемся снова к команде, реализующей условный оператор i f. Чтобы выве
сти по команде echo сообщение "Woul d you 1 i ke to p l a y а game ? " ( Не хотите
ли пои грать?), при условии, что в переменной name содержится символьная стро
ка " j ul i o " , достаточно написать следующую команду i f:
i f t e s t " $ n ame " = j ulio
then
e c h o " Wo u l d you l i ke t o p l a y а game ? "
fi
c:J �
аргументы
"_--------- julio
r::::J·
!�"!."."!'"'-
null
-- - - - =
julio
Р ис. 7 . 2. П роцесс вы пол нен и я кома нды test " $name " julio
при пустом значен и и переменной $name
И хотя это, по- видимому, нарушает упомянутое выше правило всегда заклю
чать в двойные кавычки переменные, принимающие аргументы команды t e s t,
тем не менее, опускать двойные кавычки вполне допустимо, если точно известно,
что значение переменной не является пустым (и не состоит только из пробельных
символов).
Чтобы проверить, не является ли значение переменной оболочки пустым,
можно воспользоваться операцией, перечисленной третьей в табл. 7. 1 :
t e s t " $ da y "
Следует также и меть в виду, что команда t e s t может быть весьма требова
тельной к своим аргументам. Так, если переменная оболочки s ymЬo l содержит
знак равенства, то любопытно выяснить, что же произойдет, если попытаться
проверить ее на нулевую длину:
Команда test 175
$ echo $ symЬol
$ test - z 11 $ symЬol 11
s h : t e s t : a r g ume n t e x pe c t e d
$
Эта команда даст истинный результат, если значение перемен ной s yrnЬ o l ока
жется пустым, а иначе - ложный результат. Наличие символа Х перед перемен
ной syrnЬol не позволяет команде t e s t интерпретировать символы, хранящиеся
в перемен ной s yrnЬo l , как операцию.
then
e c h o "Wou l d y o u l i ke t o p l a y а game ? "
fi
О пе рация Воз вращает нстннный резул ьтат ( нулевой код заверш ени я),
есл и
файлами . Каждая из этих операций носит унарный характер, а это означает, что
в н их предполагается еди нственный аргумент. Но в л юбом случае в качестве вто
рого аргумента служит имя файла, вкл ючая и имя каталога там, где это уместно.
В табл. 7.3 перечислены наиболее употребительные файловые операции.
Таблица 7 . 3 . Наиболее употребител ьные файловые
операции в кома нде te s t
Опера ци я Воз вра щает нстнннын резул ьтат ( н ул е вой код завершени я ) ,
есл и
В команде
- f / u s e r s / s t e ve / p h o n eboo k
возвращает исти нный резул ьтат, если файл, указанный в переменной $ma i 1 f i le,
не существует или не является обыкновенным файлом. И наконец, следующая ко
манда:
[ ! "$xl " = " $ х2 " ]
Операция -а логическое И
Операция -а выполняет логическую операцию И над двумя выражениями и
возвращает истинный результат (логическое значение TRUE), если оба соеди няе
мые выражения оказы ваются исти нными. Так, следующая команда:
[ -f " $ma i l f i l e " -а -r " $ma i l f i l e " ]
возвращает истинный результат, если файл, указанный в перемен ной $ma i 1 f i le,
является обыкновенным и доступ ным для чтения файлом. ( В дан ном примере
операция - а специально отделена пробелами для повышения удобочитаемости
условного выражен ия, что, очевидно, не оказывает никакого влияния на выпол
нение этой операци и.)
А команда
[ " $ c ou n t " -ge О -а " $ co un t " - l t 1 0 ]
К ругл ые скобки
В условном выражении команды te s t можно воспользоваться круглыми скоб
ками, чтобы изменить порядок вычисления требуемым образом. Нужно лишь
экранировать сами круглые скобки, поскольку у них имеется особое назначение в
оболочке. Таким образом, предыдущи й пример применен ия команды te s t мож
но переписать следующим образом:
\ ( " $ c oun t " -ge О \) -а \ ( " $count " - l t 10 \) ]
О п ерация -о логическое И Л И
Операция -о подобна операции -а, но только она образует логи ческое ИЛИ
из двух выражений. Это означает, что выч ислен ие всего выражения даст истин
ный результат, если исти нно первое или второе или же оба исходн ых выражения.
- n " $ma i l op t " - о - r $ HOME / ma i l f i l e
Естествен но, что такой порядок вычислени я можно при необходимости изме
н ить с помощью круглых скобок следующим образом :
\ ( "$а" -eq О -о " $Ь " -eq 2 \) -а " $ с " -eq 10
Конструкция else 181
К онструкци я e l s e
Конструкция, назы ваемая условным оператором e l se, может быть добавле
на к условному оператору i f в одноименной команде. Н и же приведена ее общая
форма.
i f кома нд а ,
then
команда
кома нда
e l se
кома нда
команда
fi
В при веденном выше при мере выполняется указан ная кома нда , и выч исля
ется код ее завершения. Если этот код оказы вается нулевым, выполняется блок
кода, следующий после оператора then, т.е. все команды, находящиеся в проме
жутке между операторами then и e l se, а блок кода, следующий после оператора
e l se, т.е. все команды, находящиеся в промежутке между операторами e l s e и
f i , игнорируется. Но в л юбом случае может быть выпол нена лишь одна из этих
послед?вательностей команд: первая из н их, если код завершения равен нулю, а
вторая - есл и этот код не равен нулю.
Более лаконично это можно пояснить следующим образом :
i f условие t h e n кома нды е сли 1 1 ст11нныi1_ре зуль та т
_ _
e l s e кома нды если ложный_резул ь та т f i
_ _
$ cat on
#
# Выясни т ь , заре гистриро ван ли указанный пол ь з о ватель
# в системе - версия 3
#
К ом а нда exi t
Встроенная в оболочку команда e x i t позволяет немедленно прервать выпол
нение программы оболочки. Ниже при ведена общая форма этой команды.
ex i t п
g rep -v $1
" " phoneboo k > / tmp / p h o n e bo o k
mv / tmp / ph o n e b o o k p h o n e boo k
$
В этом случае оболочка передаст оба аргумента команде rem из-за отсутствия
кавычек. И тогда программа rem удалит все записи с именем Sus an, указанным в
переменной $ 1 , даже не обращая внимания на то, что пользователь указал слиш
ком много аргументов.
Таким образом, в любой потенциально деструктивной программе целесоо
бразно принять меры предосторожности, убедившись в том, что предполагаемое
пользователем действие должно быть согласовано с действием, которое готова
выполн ить дан ная программа.
Одной из первых в программе rem может быть организована проверка пра
вильности количества аргументов, как это уже быно сделано ранее в программе
оп. Но на этот раз будет использована команда e x i t, чтобы прервать выполне
ние программы, есл и ей предоставлено неверное количество аргументов:
Конструкц ия elif 185
$ cat rеш
#
# Уд алить абонента и з телефо н н о г о спра воч ни ка - в е р с и я 2
#
К онструк ц ия e l i f
П о мере усложнения программ приходится все чаще прибегать к написанию
вложенных условн ых операторов i f аналогично следующему:
i f кома нда 1
t he n
команда
кома нда
else
i f команда ..
then
кома нда
кома нда
e l se
i f кома нда "
then
кома нда
186 Гл а в а 7 . В ы б ор по услов и ю
кома нда
e l se
кома нда
кома нда
fi
fi
fi
10
$
h o u r = $ ( da t e 1 cut - с 1 2 - 1 3 )
Конструкция elif 187
Если значение переменной $ hour больше или равно О ( полночь) и меньше или
равно 1 1 (до 1 1 : 5 9 : 5 9), то выводится приветствие " Good mo rn i ng " . Если же
значение переменной hour больше или равно 12 ( полдень) и меньше или рав
но 17 (до 1 7 : 5 9 : 5 9), то выводится приветствие " Good a fte rnoon " . А если
ни одно из предыдущих условий не удовлетворяется, то выводится приветствие
" Good eve n i ng " .
$ 9reetin9s
Good mo rn i n g
$
then
кома нда
кома нда
e l se
кома нда
кома нда
fi
188 Гл а в а 7 . В ы б ор по услов и ю
Последовательность команда ! ' кома нда2 ." кома нда" выполняется по оче
реди, и при этом проверяются коды завершения этих команд. Как только одна
из них возвратит нулевой код завершен ия ( TRUE), следующие после нее коман
ды выполняются вплоть до очередного условного оператора e l i f, e l s e или f i .
А если ни одно из условных выражен ий не оказывается исти н ным, то выполня
ются команды, следующие после дополнительного условного оператора e l se.
Используя новую конструкцию e l i f, программу greet i ng s можно теперь
переписать следующим образом :
$ cat greetings
#
# Про грамма дл я вывода при ве т с т в и я - в е рс и я 2
#
h o u r = $ ( da t e 1 c u t -с 1 2 - 1 3 )
name = $ 1
#
# Вы я в и т ь колич е с т во со впа вши х з а п и с ей
#
#
# Если со в па вши х з а п и с е й бол ь ше одн о й , выв е с ти сообще н и е ,
# а иначе - уд али т ь з а п ис ь
#
Теперь программа rem действует довол ьно надежно. В частности, она прове
ряет правильное количество аргументов, выводит сообщение о надлежащем ее
применении, если ей предоставлено неверное коли чество аргументов, а также
обеспечивает удаление только одной записи из файла phoneboo k. По тради ции,
принятой в системах Uпix, программа rem ни чего не выводит при удач ном исходе
выпол нения запрашиваемого действия.
К о м а нда case
Команда case, реализующая одноимен ный оператор выбора, позволяет
сравни вать единственное значение с рядом других значений или выражений и
Кома нда case 191
выполнять одну или нескол ько команд при обнаружении совпадения. Ниже при
ведена общая форма этой команды.
case зна чение i n
ша блон , ) команда
кома нда
кома нда ; ;
ша блон) команда
кома нда
команда ; ;
ша блонJ команда
кома нда
кома нда ; ;
esac
if ", $ # " - п е 1 ]
then
e c h o " U s a ge : n umЬe r d i g i t "
exit 1
fi
case "
$1 "
in
0) echo z e ro ; ;
1) e c h o o ne ; ;
2) e c h o t wo ; ;
192 Гл а в а 7 . В ы бор по услови ю
3) echo t h re e ; ;
4) e ch o fou r ; ;
5) echo f i ve ; ;
6) echo six; ;
7) echo s e ve n ; ;
8) echo e i gh t ; ;
9) echo n i ne ; ;
esac
$
квадратные скобки.
Шаблон * обозначает совпадение с любыми символами (аналогично совпаде
нию со всеми файлами в текущем каталоге по команде e cho * } , и поэтому он
нередко применяется в кон це оператора c a s e в качестве "уни версального" или
значения по умолчанию, которое гарантирует совпадение, когда ни одно из пре
дыдущих значений в операторе ca s e не совпадает. Принимая во внимание это
обстоятельство, ниже при ведена вторая версия программы numЬer, где приме
няется такой универсальный оператор case.
$ cat numЬer
#
# Пре о б ра з о ва т ь цифру в е е н а з в а н и е на а н г ли йс ком я зыке - в ер си я 2
#
Команда case 193
i f [ " $ # " - пе 1 ]
t heп
e c ho " U s a g e : п umЬe r d i g i t "
exit 1
fi
i f [ $ # -пе 1 ]
t he п
echo U s a g e : c t ype cha r
exit 1
fi
#
# Про верит ь , бьщ ли на бра н тол ь ко оди н симв ол
#
#
# А те п ер ь кл а с с ифи циро в а т ь э т о т симво л
#
P l e a s e t ype а s i n g l e c ha r a c t e r
$ c type 7
P l e a s e t ype а s i n g l e cha r a c t e r
$
следующим образом:
i f [ " $ numcha r s " -ne 2
t he n
echo P l e a s e t ype а s i ng l e c h a r a c t e r
exi t 1
fi
if $ # -ne 1 ]
t he n
echo Usage : c t ype c h a r
exit 1
fi
#
# Про вери т ь , быn л и н а бра н тол ь ко один с имв ол
#
c ha r = $ 1
c a s e " $ ch a r "
in
[ 0- 9 ] echo dig i t ; ;
[ a- z ] echo l o we rc a s e l e t t e r ; ;
[ A- Z ] echo uppe r c a s e l e t t e r ; ;
? echo s pe c i a l c h a r a c t e r ; ;
*
echo P l e a s e t yp e а s i ng l e c h a r a c t e r ; ;
esac
$
hou r = $ ( d a t e + 'r H )
c a s e " $ ho u r "
in
О? 1 1 [ 01 ] e c h o " Good mo rn i n g " ; ;
1 [ 2 -7 ] e c ho " Good a f t e r n o o n " ; ;
*
e c h o " Good even i ng " ; ;
esac
$
П уста я ко м а нд а
В каждой совпадающей ветви выбора из оператора c a s e и в каждом условном
операторе i f - then требуется результирующая команда. Но иногда возни кает
потребность вообще н ичего не выполнять по задан ному условию. Как же это сде
лать? С помощью встроен ной в оболочку пустой команды, имеющей очень про
стую форму : . Нетрудно догадаться, что эта команда предназначена именно для
того, чтобы вообще н и чего не делать.
Как правило, пустая команда служит для того, чтобы удовлетворить требова
нию о наличии команды по заданному условию, особенно в условных операторах
i f. Допустим, требуется убедиться в том, что значение, хранящееся в перемен ной
s y s t em, присутствует в файле / u se r s / s teve /ma i l / s y s t em, а есл и оно отсут
ствует - вывести сообщение об ошибке и выйти из программы. С этой целью
можно было бы написать следующий условный оператор:
i f g rep n л s s ys t em " / u s e r s / s t e ve /ma i l / s y s t ems > / de v / n u l l
then
e l se
echo " $ s y s tem i s n o t а va l i d s y s t em "
exi t 1
fi
Конструкц и и && и 1 1 199
Если проверка условия проходит, то н и чего делается. А если дан ная проверка
не проходит, то выводится сообщение об ошибке и происходит выход из про
граммы.
Откровенно говоря, данный кон кретны й пример можно было бы переделать,
изменив на обратную структуру команды g rep (напри мер, воспользовавшись
аргументом ! команды tes t). Но и ногда проще организовать проверку положи
тельного, а не отрицательного условия, н ичего при этом не делая. Но в л юбом
случае очень полезным оказывается своевременный комментарий , который бук
вально творит чудеса, когда приходится читать исходный текст программ ы мно
гие недели, а то и месяцы спустя.
А в следующей команде:
-z " $ E D I TOR" ] & & E D I TOR= / Ь i n / ed
то команда e cho будет выпол нена лишь при неудач ном исходе выполнения ко
манды grep, т.е. в том случае, если значен ие перемен ной $narne не удастся найти
в файле phoneboo k. И это выражение равнознач но при веденному н иже условно
му оператору.
i f g r ep " $ name " phonebo o k
then
e l se
echo " Cou l dn ' t f i nd $ n ame "
fi
В левой или правой части этих конструкций можно указать сложные последо
вательности команд. В левой части этих конструкций проверяется код заверше
ния последней команды в кон вейере. Следовательно, в приведен ном ниже услов
ном выражении команда e cho выполняется лишь при неудачном исходе выпол
нения команды g rep.
who 1 grep " л $ n ame " > / de v / n u l l 1 1 echo " $ n ame ' s n o t l ogged on "
Конструкции & & и 1 1 можно также объеди нять в одной командной строке, как
демонстрируется в следующем примере:
who 1 grep " $ n ame " > / d e v / n u l l & & echo " $ n ame ' s not l ogged o n " \
л
К о м а нда fo r
Команда for служит для выполнения одной и л и нескольких команд указан
ное количество раз. Ниже приведена общая форма этой команды, реализующей
оператор цикла for.
t· a r va r i n сло в о . сло в о . . . сло в о "
do
кома нда
к ома нда
done
for i i n 1 2 3
do
echo $ i
done
Чтобы опробовать этот цикл, наберите его непосредственно на терми нале ана
логично любой другой команде оболочки, как показано ниже.
$ for i in 1 2 3
> do
> echo $ i
> done
1
2
3
$
В ожидании ввода оператора done для завершения цикла for оболоч ка про
должает выводить вспомогательное приглашение на ввод команд. Как только
пользователь введет оператор done, оболочка продолжит выполнение ци кла.
В данном примере после оператора in указаны три элемента (значения 1, 2 и З),
и поэтому тело цикла (в данном случае - единственная команда e cho) будет вы
полнено в общем три раза.
Сначала переменной цикла i присваивается первое значение 1 из списка. Затем
тело цикла выполняется первый раз. При этом значение переменной цикла i вы
водится на терми нал. Затем переменной цикла i присваивается второе значение 2,
и команда e cho выполняется снова, выводя это значение на терминал. Далее пере
менной цикла i присваи вается третье значение З, и команда echo выполняется
в третий раз, выводя это значение на терминал. В этот момент в списке больше
не остается слов, поэтому выполнение цикла for завершается. После этого обо
лочка выводит приглашение на ввод команд, уведомляя о том, что цикл завершен.
А теперь вернемся к примеру программы run, рассматривавшейся в главе 6
и позволявшей обработать файл в последовательности команд tЫ, nro f f и lp:
$ cat run
tЫ $ 1 1 n ro f f -mm -Tlp 1 lp
$
Если по команде run требуется вывести все файлы из текущего каталога, для
этого достаточ но набрать следующий цикл:
for f i l e i n *
do
run $ f i l e
done
f o r f i l e in $ f i l e s
do
run $ f i l e
done
fo r f i l e i n $ *
do
tЫ $ f i l e 1 n ro f f - rom - T l p 1 l p
done
$
П еременная $ @
Раз у ж мы коснулись переменной $ * , рассмотрим более подробно, каким об
разом действует она и родственная ей переменная $ @ . С этой целью рассмотрим
следующую программу a r g s , отображающую в отдельных строках все аргумен
ты, введенные в командной строке:
$ cat args
echo NumЬe r o f a r gume n t s pa s s ed i s $ #
for arg in $*
do
echo $arg
done
$
$ args ' а ь · с
NumЬ e r o f a r g umen t s pa s sed i s 2
а
ь
с
ь
с
$ args ' а ь · с
NwnЬ e г o f a rg ume n t s p a s s e d i s 2
а Ь
с
done
done
Если принять во вн и мание эту особенность орган изации циклов for, то тре
тью и последнюю версию программы a r g s можно написать и опробовать следу
ющим образом :
$ cat args
echo NumЬe r o f a rgumen t s pa s s ed i s $ #
for arg
do
echo $arg
done
$ args а Ь с
N umЬe r o f a rg umen t s p a s s e d i s 3
а
ь
с
$ args ' а ь · с
N umЬ e r o f a rg umen t s p a s s e d i s 2
а Ь
с
$
К о м а нда whi le
Второй для организаци и ци клов является команда, реализующая оператор
whi l e. Ниже приведена его общая форма.
Ком а нда while 209
wh i l e кома нда ,
do
кома нда
команда
done
$ cat prargs
#
# В ы в е с т и а р гуме н ты кома ндно й с т ро ки в о тдел ь ных стр о ка х
#
К о м а нд а until
Цикл wh i le выполняется до тех пор, пока проверочное выражение продол
жает возвращать нулевой код завершения ( TRUE). Совсем иначе действует цикл
unt i l . Он продолжает выпол нять блок кода в своем теле до тех пор, пока прове
рочное выражение возвращает ненулевой код завершения, и прекратит выполнять
этот блок кода, как только возвратится нулевой код завершения. Ниже приведена
Кома нда u ntil 211
общая форма команды, реал изующей цикл unt i l . Как и в цикле whi l e, коман
ды, находящиеся в теле ци кла unt i l , т.е. в промежутке между операторами do
и done, могут быть так и не выполнены, если команда, возвратит нулевой код
своего завершения при первом же выполнении.
u n t i l кома нда ,
do
кома нда
к ома нд а
done
i f [ " $ # " пе 1 ]
-
theп
e cho " U s a ge : wa i t f o r u s e r "
exit l
fi
u s e r= " $ 1 "
#
# Про в е р я т ь каждые 6 0 с е кун д , заре ги с т риро в ал с я ли
# ука з а нн ый п ол ь зо в а тел ь в с и с теме
#
#
# Если п р о грамма дойде т до э то г о м е с т а , з н а чи т ,
# у к а з а н н ый пол ь з о в а т е л ь з а р е гис триро в а л с я в си с теме
#
После того, как будет проверено, что программе предоставлен только оди н ар
гумент, значение переменной $ 1 , хранящей этот аргумент, присваивается пере
менной u s e r . Затем начинается цикл unt i l , который будет выполняться до тех
пор, пока команда grep не возвратит нулевой код завершения, т.е. до того момен
та, когда указанный пользователь зарегистрируется в системе. А до тех пор, пока
он не войдет в систему, тело цикла unt i l (т.е. команда s l eep) будет продолжать
ся, приостанавли вая всякий раз выпол нение программы на 60 секунд. По истече
н и и заданного промежутка времени в одну м инуту снова вызывается конвейер
команд, указанный после команды unt i l , и весь процесс повторяется снова.
По окончании цикла unt i l , свидетельствующего о том, что нужный пользо
ватель зарегистрировался в системе, на терминал вы водится соответствующее со
общение. И на этом дан ная программа завершается, как показано ниже.
$ wai tfor sandy Про ходит вр емя
s aпdy h a s l og g e d оп
$
П ри меча н ие
По умолчан и ю все процессы а втоматически заверша ются , когда в ы в ыходите из системы .
Есл и же требуется . что б ы п рогра м м а п родолж ила свое в ы п ол нен ие после того , как вы вы
йдете из системы . можете за пустить ее с помощью ком а нды nohup ил и за план и ровать ее
вы полнен ие по команде at ил и cron. За дополн ител ьной справкой обра щайтесь к руко
водству пользователя вашей системы U п ix.
if "$ 1 " = -m ]
t h en
ma i l op t =TRUE
shi ft
e l se
ma i l o p t = FA L S E
fi
214 Гл а в а 8 . П о вторное выполнен ие команд
#
# Если пр о грамма дойдет до эт о го ме с т а , з на чи т ,
# у к а з ан н ый п о л ь з о ва т ел ь заре ги стриро в а л с я в с и с теме
#
U s age : wa i t fo r [ -m ] u s e r
- m me a n s t o Ье i n f o rmed Ь у ma i l
$ wai tfor -m sandy &
( 1 ) 54 35
Кома нда u ntil 215
$ vi newmemo Продолжить ра б о ту
you have ma i l
$ ma i l
rrom s t e ve Wed Aug 2 8 1 7 : 4 4 : 4 6 E DT 2 0 0 2
sandy h a s l ogged о п
?d
$
done
done
brea k
e l se
p r o c e s s crnd " $ crnd "
fi
done
wh i l e [ " $ c ou n t " - lt 10 ]
do
i f [ -n " $ e r ro r "
then
brea k 2
fi
done
done
циклы wh i l e и for будут прерваны, если значение перемен ной e r ror окажется
непустым.
которое обозначает пропуск команд в самых внутренних циклах, после чего вы
полнение программы продолжается обычным образом:
218 Гл а в а 8. Повторное в ы пол нен ие ком а нд
for f i le
do
if ! -е " $ fi le "
then
e c h o " $ f i l e not found ! "
con t i nu e
fi
#
# Обра бота т ь файл
#
done
#
# Обра бота 1ъ файл
#
fi
done
r e que s t id is l a s e r l - 8 7 ( s t anda rd i np u t )
reque s t i d i s l a s e r l - 8 8 ( s t anda r d i n p u t )
reque s t i d i s l a s e r l - 9 2 ( s t a nda r d i n p u t )
done > o u t p u t
done 2 > e r ro r s
Следует, однако, иметь в виду, что после операторов then и e l s e точки с за
пятыми не указываются. Многие программирующие на языке оболочки пользу
ются гибридной структурой, где условные операторы i f структурированы таким
образом :
if условие then
кома нда
fi
К оманда ge topts
Произведем дал ьнейшее расширение программы wa i t for, добавив пара
метр - t, обозначающи й, как часто (в секундах) осуществляется проверка реги
страции нужного пол ьзователя в системе. Теперь программа wa i t for должна
принимать два параметра, -m и - t. Допустим, эти параметры могут указываться
в любом порядке в командной строке, но перед именем контрол ируемого поль
зователя. Таким образом, достоверные варианты ввода данной программы в ко
мандной строке выглядят следующим образом:
wa i t fo r ann
wa i t fo r -m ann
wa i t fo r - t 6 0 0 ann
wa i t fo r -m - t 6 0 0 a n n
wa i t f o r -t 6 0 0 - m ann
где первый аргумент air обозначает три допустимых параметра команды ( -а,
-i и - r ) , а второй аргумент option - имя переменной, используемой в команде
getopt s для хранения каждого обнаруженного при совпадении значения.
Команда getopt s позволяет также группировать параметры вместе в команд
ной строке. Для этого достаточно указать оди н знак "минус" и несколько после
дующих параметров. Так, команда foo в рассматриваемом здесь примере может
быть выполнена следующим образом:
f o o -а -r -i
или же так:
foo - a r i
На самом деле команда getop t s намного более эффективна, чем было про
демонстрировано до сих пор! Она, напри мер, способна учесть и то обстоятель
ство, что параметру требуется допол н ительный аргумент. Например, новый пара
метр - t, которым необходимо дополн ить команду wa i t for, должен быть указан
с дополн ительным аргументом.
Чтобы проанализировать надлежащим образом аргументы указанного поль
зователем параметра, команде getopts требуется, чтобы анализируемая коман
да вызы валась хотя бы с одн и м пробелом, отделяющим параметр от аргумента.
В дан ном примере параметры не могут быть сгруппированы вместе.
Чтобы указать команде getopts на то, что параметру требуется аргумент,
после буквы, обозначающей этот параметр, следует указать двоеточие в строке
команды getop t s . Таким образом, в программе wa i t for, допускающей нали
чие параметров - m и - t, последнему из которых требуется допол нительный аргу
мент, команду getopts следует вызвать так:
ge t op t s mt : op t i o n
# У с т а н о в и т ь з н а ч е н и я по ум олч а нию
ma i l op t = FALSE
i n t e r va l = б O
224 Гла в а 8. Повторное вы полнение команд
wh i l e g e t o p t s mt : opt i o n
do
case " $ op t i on "
in
m ) ma i l op t =TRUE ; ;
t ) i n t e rva l = $ 0PTARG ; ;
\ ? ) echo " Usage : wa i t fo r [ -m ] [ - t n ] u s e r "
echo " - m means t o Ь е i n f o rmed Ь у ma i l "
e cho " - t means che c k every n s e c s . "
exit 1 ; ;
esac
done
s h i f t c ount = $ ( ( 0PT I N D - 1 ) )
s h i f t $ s h i f tcount
user=$ 1
#
# Про верять , заре гистриро валс я ли
# ука з анный пол ь з о ватель в системе
#
#
# Если про грамма дойдет до э т о г о мес т а , значит ,
# указанный поль з о в а тель заре гис трировался в системе
#
$ waitf"or -ш
Mi s s ing u s e r name !
Команда getopts 225
К ом а нда read
Общая форма команды read выглядит следующи м образом:
r e a d переме нные
exit 1
fi
#
# Выяснит ь , суще с т вует ли целе вой файл
#
#
# Цел е в ой файл не с уще с т вуе т или в веден положител ь ный о т ве т
#
Следует заметить, что если целевой файл уже существует, команда echo вы
водит приглашение дать положительный или отрицательный ответ. А следующая
далее команда read вынуждает оболоч ку ожидать ответа пользователя. В данном
примере программы демонстрируется, что сама оболоч ка не выводит приглаше
н ие, ожидая от пользователя ввода дан ных. Эта обязанность возлагается на авто
ра программы.
Кома нда read 229
необходимы на тот случай, если пользователь просто нажмет клавишу < Enter>, не
вводя ни каких данных. В таком случае оболоч ка сохранит в перемен ной answe r
пустое значение. А без кавычек в результате данной проверки было б ы выведено
сообщение об ошибке.
Обратите также внимание на точку с запятой, которая позволяет указывать
операторы then в одной строке с условн ым оператором i f. Это типичный прием,
к которому прибегают программирующие на языке оболочки, как упоми налось в
предыдущей главе.
Примеч а ние
Оболоч ки в некоторых системах Li n u x и М ае OS Х не и нтерпрети руют уп ра вля ющие сим
вол ы в кома нде echo . и поэтому при веденная вы ше кома нда echo отобразит следующи й
резул ьтат:
newfile . txt al ready exists ; overwrite (yes/no ) ? \с
Есл и в резул ьтате п роверки выявится , что о болочка действует и менно таким о бразом , в ы
зовы команды echo в этих кон кретн ых местах п рогра м м ы следует замен ить на о б ра щения
к отдел ьной п рогра мме /Ьin/echo . и тогда он и будут вы полнены п ра вильно. А все остал ь
н ые вызовы о б ыч ной команды echo следует оста вить без изменен ия.
230 ГЛ<�ва 9. В вод и вы вод да н н ых
if [ " $ # " - пе 2 ] ; t h e n
e c h o " U s a g e : mycp f rom t o "
exit 1
fi
f r om= " S l "
to=" $ 2 "
#
# Выясн ит ь , я вл я е т с я целе в ой ф айл к а т ало гом
#
if -d " $ t o " ] ; t h e n
t o = " $ t o / $ ( b a s e n ame S f r om ) "
fi
#
# Выя снит ь , с уще с т вуе т ли уже целе вой фа йл
#
if - е " $ t o " J ; t h e ri
e ch o " $ t o a l r e ady e x i s t s ; o v e r w r i t e ( ye s / no ) ? \ с "
r e a d a n s we r
i f [ " S a n s we r " ! = y e s ] ; t h e n
e c h o " Сор у n o t p e r fo rme d "
exit О
fi
fi
#
# Целе вой файл не суще с т вует или в ве де н положи тел ь ный о т в е т
#
где Ь i n каталог, это означает, что файл / tmp /da t a требуется скопировать в
-
$ cat шуср
#
# Копиро в а т ь файл - о кончатель н а я версия
#
#
# Если коли ч е с т в о ар гуме н т о в ме н ь ше или бол ь ше двух , а
# последний ар гуме н т не являе т с я каталогом, вывести
# сообщение об ошибке
#
#
# Перебра т ь каждый файл в переме нной fi lel i s t
#
for f rom in $ f i l e l i s t ; do
#
# Выяснить , является целе вой файл каталогом
#
#
# Доба вить имя файла к переменной copyl i s t
# е сли файл еще не суще с т вуе т или же е сли
# пол ь з о ва тель дает ра зрешение на е го пере запись
234 Глава 9. Ввод и вывод дан н ых
#
# А т епе рь сдела т ь копию . С н ачал а убеди ть с я в н а личии
# файло в для копи ро вани я
#
А
теперь рассмотрим некоторые примеры применения программы mycp, пре
жде чем пояснять ее исходный текст.
$ ls - с Выяснить , ка кие фа йлы имеются в наличии
b i n l u name s prog l
prog2
$ l s bin И что на ходится в ка талоге bin
lu
nu
p rog l
$ mycp Без аргументов
U s age : mycp f i le l f i l e 2
mycp f i l e ( s ) d i r
$ mycp names proql proq2 Последний аргумент не является ка талогом
U s a ge : mycp f i l e l f i l e 2
mycp f i l e ( s ) d i r
$ mycp names progl proq2 l u Ьin Пра вильное применение
b i n /prog l a l ready ex i s t s ; ove rwr i t e ( ye s / no ) ? ye s
b i n / l u a l ready e x i s t s ; o ve rw r i t e ( ye s / no ) ? no
$ l s - 1 Ьin Выяснить , что же произошло
total 5
- rw- r - - r - - 1 s t eve s te ve 543 Ju l 19 14 : 10 lu
- rw- r - - r - - 1 s t e ve s t eve 949 Ju l 21 17 : 1 1 n ame s
- rw - r - - r - - 1 s t e ve s t e ve 38 Ju l 19 09 : 55 nu
- rw- r - - r - - 1 s t e ve s te ve 4 98 Ju l 21 17 : 11 progl
- rw- r - - r - - 1 s t e ve s t e ve 4 98 Ju l 21 17 : 11 prog2
$
Кома нда read 235
e c ho '
Wo u l d you l i ke t o :
1 . Loo k s ome o n e u p
2 . A d d s ome o n e t o t h e p h o n e boo k
3 . Remo ve s ome o n e f rom t h e phone boo k
#
# П ро ч и т а т ь и о браб о т ат ь вы бр ан н ый вариант
#
read c h o i c e
e ch o
c a s e " $ c ho i ce "
in
1 ) e c h o " E n t e r name t o l o o k u p : \ с "
r e a d n ame
l u 11 $ name " ; ;
2 ) e c h o " En t e r n ame t o Ье added : \ с "
r e a d n ame
e c h o " E n t e r n umЬe r : \ с "
read n umЬe r
add " $ n ame " " $ numЬe r " ; ;
3 ) e c h o " E n t e r name t o Ье remove d : \ с "
read name
rem " $ name " ; ;
* ) e c h o " Ba d c ho i ce " ; ;
esac
$
Wou l d you l i ke t o :
1 . Loo k s omeone up
2. Add someone t o t he phone boo k
3. Remove s omeone f r om t h e phone boo k
P l e a s e s e l e c t o n e o f t h e above ( 1 - 3 ) : 2
En t e r n ame t o Ье added : El Coyote
En t e r n umЬe r : 2 1 2 - 5 67 - 3232
$ rolo По пр обов а ть еще ра з
Wou l d y o u l i ke t o :
1 . Loo k s omeone up
2 . Add s omeone t o t h e phone boo k
3 . Remo ve s omeone f r om t h e phone boo k
P l e a s e s e l e c t o n e o f t h e above ( 1-3) : 1
En t e r n ame to l o o k up : Coyote
El Coyote 2 1 2 - 5 6 7 - 3 2 3 2
$ rolo По пр об ов а ть сно в а
Wou l d you l i ke t o :
1 . L o o k s ome one up
2. Add someone t o t h e phone bo o k
3. Remo ve s omeone f rom the phone boo k
#
# Е сли п редоста вл е ны ар гуме н ты , прои з в е с т и п о и с к
#
#
# Вьmолнит ь ци кл до т е х п ор , п о ка не буде т
# сделан п ра вил ь ный выбор
#
#
# Отоб ра з и т ь ме ню
#
echo '
Wou l d you l i ke t o :
1 . Loo k s ome o n e u p
2. Add s ome o n e t o t he p h o n e boo k
3. Remove s omeone f r om t h e phone boo k
#
# П ро чи та т ь и о бра б о т а т ь в ыб ра нный в ар и а нт
#
read cho i ce
echo
c a s e " $ ch o i ce "
in
1 ) echo " En t e r n ame t o l o o k up : \ с "
read n ame
lu " $ n ame "
va l i dc h o i c e=TRUE ; ;
2 ) echo " En t e r name t o Ье added : \ с "
read name
echo " En t e r numЬe r : \ с "
read numЬe r
add " $ name " " $ numЬe r "
va l i dc ho i ce=TRUE ; ;
3 ) echo " En t e r name t o Ье remo ved : \ с "
read n ame
rem " $ name "
va l i dcho i c e=TRUE ; ;
* ) echo " Bad cho i ce " ; ;
esac
done
$
Wou l d you l i ke t o :
1 . Loo k s omeone up
2 . Add someone to the phone boo k
3 . Remo ve s omeone f rom t he phone boo k
Кома нда read 241
P l e a s e s e l e c t o n e o f t h e above ( 1-3) : 4
Bad c h o i ce
Wou l d you l i ke t o :
1 . Loo k s ome o n e up
2 . Add s omeone t o t h e phone boo k
3 . Remo ve s ome one f rom t h e phone boo k
Wou l d y o u l i ke t o :
1 . Loo k s ome o n e u p
2 . A d d s omeone t o t he phone boo k
3 . Remo ve some o n e f rom t h e phone boo k
wh i l e r e a d n l n 2
do
echo $ ( ( $nl + $ п2 ) )
done
$
Цикл wh i l e выпол няется при условии, что команда read возвратит нулевой
код завершения, а это произойдет лишь в том случае, если для чтения все еще
имеются данные. В теле дан ного цикла проч итанные из строки значения (пред
положительно целочисленные, поскольку н и какой проверки ошибочного ввода
данных не производится) складываются вместе, а полученный результат направ
ляется в стандартный вывод по команде echo. Ниже приведен пример примене
ния программы add i .
$ addi
10 25
35
- 5 12
7
123 3
126
<Ct rl + b>
$
-394 -4 93
$ addi < da ta > SUDIS
$ cat SUDIS
9 1 94
-2
699
4233
-887
$
l i neno= l
cat $ * 1
wh i l e r e a d l i ne
do
echo " $ l i n eno : $ l i n e "
l i n e n o= $ ( ( l i n e n o + 1 ) )
done
$
на строку
wh i l e read -r l i ne
например, дан ные в столбцах. Для решения подобных задач в системах Unix пре
доставляется команда p r i n t f. Те, у кого и меется некоторый опыт программиро
вания на языке С или С+ +, обнаружат немало сходств этой команды с фун кцией
print f ( ) .
Общая форма команды p r i nt f вы глядит следующи м образом :
p r i n t f " форма т " a r g l a rg 2 . . .
где форма т это форматирующая строка с подробными сведениями о том, как
-
Все пять символов специфи каторов формата, перечислен ных первыми в табл.
9.2, служат для отображения целых ч исел. В частности, спецификатор формата
%d служит для отображения целых чисел со знаком, а специфи катор формата
%u - для отображения целых чисел без знака, хотя им можно воспользоваться и
для отображения отрицательных целых чисел в положительном представлени и.
По умолчан и ю целые числа, отображаемые в восьмеричном или шестнадцатерич
ном формате, не содержат префикс О или Ох, хотя это положение можно испра
вить, как будет показано далее.
Символьные строки вы водятся с помощью спецификатора формата %s или %Ь.
В частности, специфи катор формата %s служит для вывода символьных строк в
буквальном виде, т.е. без обработки любых управляющих символов, экранируе
мых знаками обратной косой черты, а специфи катор формата %Ь для принуди -
T h e u n s i gn e d va l ue f o r - 1 0 0 0 i s 4 2 9 4 9 6 6 2 9 6
$ printf "This s tring contains а Ьackslash
Aescape : % s \ n " " test\nstring"
Th i s s t r i n g c o n t a i n s а bac k s l a s h e s cape : t e s t \ n s t r i n g
$ printf "This s tring contains an interpreted
.Aьacks lash escape : %b\ n " " test\nstring "
Th i s s t r i n g c on t a i n s an i n t e rp r e t ed b a c k s l a s h e s c a p e : t e s t s t r i ng
$ printf "А s tring : % s and а character : %c\n " hello А
А s t r i ng : he l l o a n d а c h a r a c t e r : А
$
где тип - символ спецификатора формата из табл. 9.2. Как видите, для обозначе
ния спецификатора формата требуется только знак процента и тип, а остальные
параметры, называемые модификатор ами, необязательны. Достоверными счита
ются следующие фла ги: -, +, #, а также пробел.
В частности, флаг - обозначает выравн ивание выводимого значения по лево
му краю, что станет понятнее при дальнейшем рассмотрен ии модификатора ши
рина. Флаг + предписывает команде p r i nt f предварять целые числа знаком +
или - (по умолчанию только отрицательные числа выводятся со знаком). Флаг
# предписывает команде pr i n t f предварять восьмеричные числа префиксом
О, а шестнадцатеричные - префи ксом Ох или ОХ, обозначаемым как %#х или
%#Х соответственно. И наконец, символ пробела предписы вает команде p r i nt f
предварять положительные целые числа пробелом, а отрицательные целые чис
ла - знаком - для целей выравни вания.
Ниже приведен ряд допол н ительных примеров применен ия команды print f.
Обратите особое внимание на форматирующие строки !
$ printf " % +d\n % +d\n%+d\n " 10 - 1 0 2 0
+10
-10
+20
$ printf " % d\n% d\n% d\ n " 1 0 - 1 0 2 0
10
-10
Команда printf 249
20
$ printf " \ fo \lx\n" 1 0 0 2 0 0
0 1 4 4 Охс8
$
Как видите, применение знака + или пробела в качестве флага приводит к ак
куратному выравн и ван ию столбца с положительными и отрицательными ч исла
ми по левому краю. Модификатор ширина это положительное число, обозна
-
чающее минимальную ширину поля для вывода аргумента. Если флаг - не указан,
аргумент в этом поле выравни вается по правому краю, как показано н и же.
$ printf " % 2 0 s % 2 0 s \ n " stringl s trin92
stringl s t r ing2
$ printf " % - 2 0 s % - 2 0 s \ n " s tringl s tring2
s t r ingl s t r ing2
$ printf " \ Sd\ Sd\ Sd\ n " 1 1 0 1 0 0
10 1 00
$ printf " % 5d% Sd% Sd\ n " - 1 - 1 0 - 1 0 0
-1 - 1 0 - 1 00
$ printf " % - Sd% - Sd% - Sd\n " 1 10 1 0 0
1 10 100
$
ч ить как ширину поля, так и заполнение чисел начальными нулями или усечение
символьных строк. Такое сочетание обоих модификаторов демонстрируется в
следующих примерах:
$ printf " : % 1 1 0 . Sx : % 5 . 4x : % 5 . 4d\n " 1 1 0 1 0 0
OxO O O O l : О О Оа : 0 1 0 0
$ printf " : % 9 . Ss : \ n " aЬcdefg
abcde :
$ printf " : % - 9 . S s : \n " aЬcdefg
: abcde
$
Как видите, обе команды pr i n t f в данном примере дают оди наковый резуль
тат. В первом случае числовой аргумент 1 2 служит для обозначения ширины
первой символьной строки, тогда как аргумент 10 для обозначения ширины
-
cat $ * 1
wh i l e read n wnЬe r l n wnЬe r 2
do
p r i n t f " 'f, 1 2 d И 2 d \ n " $ n umЬe r l $ n wnЬ e r 2
done
$ cat data
1234 7 960
593 -595
395 304
32 3 4 999
- 3 9 4 .., 4 9 3
$ aliqn data
1234 7 960
593 -595
395 304
3234 999
-394 - 4 93
$
Л окал ьн ые пере м е н н ые
Наберите следующую программу под названием va rte s t на своем компью
тере:
$ cat vartes t
echo : $х :
$
$ cat vartes t2
х= 5 0
ec h o : $ х :
$ x= l O O
$ vartest2 Выпол ни ть э ту про гра мму
: 50 :
$
П одоболочки
Необычное на первый взгляд поведение, проявляемое программами va r t e s t
и va rte s t 2 , обусловлено тем, что эти программы выполняются исходной обо
лочкой в отдельных подоболочках. По существу, подоболочка является совершен
но новой оболоч кой , предназначенной лишь для выполнения требуемой про
граммы.
Когда вы обращаетесь к исходной оболочке с запросом выполн ить програм
му va r t e s t , она запускает новую оболочку для выполнения этой программы.
Всякий раз, когда действует новая оболочка, она выполняет собственную среду
со свои ми локал ьными переменными. Подоболоч ке неизвестны локальные пере
менн ые, которым присваиваются значения в исходной (родительской) оболочке.
Более того, в подоболочке нельзя изменить значение перемен ной из родительской
оболочки, о чем свидетельствует результат выполнения программы va rte s t 2 .
Рассмотрим происходящий п р и этом процесс, чтобы стало понятнее, что со
бой представляет соблюдение области действия перемен ных в программах обо
лочки. Перед выполнением программы varte s t 2 в оболоч ке переменной х было
присвоено значение 1 0 0 (рис. 1 0. 1 ).
• • •
Исходная
об олоч ка
• • •
1
ал
Л
� ок ь �
ные переменные
L:::J • - - - - - - - - - - - - - - �t:::i • • •
Исходная
о бо лоч ка
1 • • •
1
1
( ул а)
п б
vartest2
одо о очк
• • •
у
$
у = 10
$
Э Л а
е е л ны е
§ кспор тиру мы ок ь
пер еменные перем енные �
= 1 00
Исходная
- - - - - - - - - - _. о болочка ""(- - - - - - - - "
• + • • • •
1 Копирование
Э
у сп р руемы
к ерое тие е
п м нные
б л а
var1est3
- - - - - - - - - - _. ( подо о о чк )
• • • • • •
А теперь самое время задать следующий вопрос: что произойдет, есл и значен ие
экспортированной переменной измен ится в подоболоч ке, т.е. окажется л и она до
ступной в родител ьской оболоч ке по завершен ии подоболоч к и ? Чтобы ответить
на этот вопрос, рассмотри м следующую программу под назван ием va r te s t 4 :
$ cat vartes t4
х=50
у=5
$
оболочка � - - - - - - - - -.
_
• • • • • •
Э и ь
Л а
сп рт руемые л ные
к ерое енные У ) ок
перем енные
§ п м
- - - - - - - - - _.
б л а
( п vartest4
одо о очк � - - - - - - - - -.
�
= 50
• • • • • •
$ vartest4
х
у 5
z = 1
$
----------· оболочка �- - - - - - - - ·
• 11 • • • •
1
1 copied
Э
t с рт р е е 1 е
к пео е ие у мы Локальны
п р м нные перем енные �
= 50
б л а
( п vartest4
----------• одо о очк ) �- - - - - - - - ·
1
1
• 11 • • • •
1 1
1 copied 1
Э 1
t с рт р е е t
к пео е ие у мы
п р м нные
( п vartest5
б л а
----------• одо о очк )
• • • • • •
4. Перемен ная может быть экспортирована в любой момент до или после при
сваивания ей значения, но она прини мает свое значение в момент экспорта,
а последующие изменен ия в ней не отслеживаются.
Команда export -р
Если ввести команду export -р, то в итоге будет получен список переменных
и их значен ий, экспортируемых в рабочую оболоч ку, как показано ниже.
$ export -р
expo r t LOGNAМE = s t e ve
e xpo r t PAT H = / b i n : / u s r / b i n : .
expo r t T I MEOUT= 6 0 0
e xpo r t T Z = E ST 5 E DT
expo r t y= l O
$
П е ре м ен н ы е P Sl и PS2
Последовательность символов, употребляемых в оболочке в качестве при
глашения на ввод команд, хранятся в перемен ной окружения PS 1 . Но значение
этой перемен ной можно изменить на любое другое, и с этого момента новое
значение будет использоваться далее в оболоч ке, как демонстри руется в следу
ющем при мере:
$ echo : $PS 1 :
:$ :
$ PSl= "=> "
= � > pwd
/use r s / s teve
� = > PSl = " I awai t your next cOJDJDand , master : "
I a wa i t yo u r n e x t c omma n d , ma s t e r : date
Wed Sep 1 8 1 4 : 4 6 : 2 8 E DT 2 0 0 2
I awa i t you r n e x t c omma n d , ma s t e r : PS1="$ "
$ В ерну ть ся к о бычному пригл ашению
перемен ной PS2. Содержимое и этой переменной можно изменить по своему ус
мотрению, например, следующим образом:
$ echo : $ PS2 :
: > :
Как тол ько вы выйдете из системы , все изменен ия, внесен ные в упомянутых
выше переменн ых, исчезнут, как, впрочем, и все изменен ия в любых других пере
мен ных оболочки. Если внести изменение в переменную PS 1, ее новое значен ие
будет использоваться далее в сеансе работы в оболоч ке. Но когда вы войдете в
систему в следующи й раз, то увидите прежнее приглашен ие, если только не со
храните новое значение переменной PS l , введя его в файл . pro f i l e, рассматри
ваемый далее в этой главе.
Со вет
У п ри гла шения , хра ня щегося в перемен ной PS l . имеется собственный язы к со специал ь
н ы м и последовател ьностя м и опера ци й . п роизводя щих подсчет команд, выбор текущего
каталога , оп ределение времени суток и в ы пол няющих м ногое другое. Озн а ко м иться с эти м
языком мож но, п рочита в раздел " Prom pti пg" ( В ыдача п р и глашения) на операти вной стра
ни це руководства по оболочке Bash или S h .
Содержи мое перемен ной НОМЕ можно измен ить. Но делать этого все же не ре
комендуется, если только вы не готовы к тому, что положение дел может очень
быстро оказаться весьма шатким.
Перемен н ая РАТИ
Вернемся, однако, к программе ro l o из главы 9, выполнив ее следующим об
разом:
$ rolo Liz
L i z Stachiw 2 12-775-2298
$
Допустим, что для приведения дел в более орган изованный порядок эта про
грамма была создана в подкаталоге / b i n пользователя s t eve:
$ pwd
/ u se r s / s t e ve / b i n
$
она запустит его на выполнен ие. А если оболочке не удастся найти испол няемый
файл rolo ни в одном из каталогов, перечисленных в перемен ной РАТН, то она
выдаст сообщен ие об ошибке " not found" (не найдено).
Чтобы поиск нач и нался, прежде всего, с текущего каталога, точку следует
указать в переменной РАТН первой, как показано н и же. Следует, однако, иметь в
виду, что из соображений безопасности поиск не должен производиться в теку
щем каталоге пользователя прежде, чем в системных каталогах .
. : /Ь i n : /us r /Ь i n
или
. / rolo
if "$#" - п е 1 ]
t hen
e cho " I n co r r e c t numЬ e r o f a r gume n t s "
e c h o " U s a g e : l u name "
exi t 1
fi
cd / u s e r s / s t e ve / Ы n
g rep � $ 1 " phonebo o k
Такой способ при годен в том случае, если приходится немало мани пулировать
различными файлами в отдельном каталоге. Для этого достаточно перейти снача
ла в нужный каталог по команде cd, а затем непосредственно обратиться ко всем
требующи мся файлам.
Второй , более распространенн ы й способ состоит в том, чтобы указать полный
путь к файлу phonebo o k в команде grep:
#
# Е сли предо с т а влены аргуме н т ы , прои з в е сти поиск
#
#
# Вьmолни т ь цикл до т е х пор , п о к а не буде т
# сделан правиль ный выбор
#
e cho '
Wou l d you l i ke t o :
#
# Прочи т а т ь и обра б о т а т ь выбранный вариант
#
read cho i c e
e cho
if "$#" -пе 2 ] ; t h e п
e ch o " I п c o r r e c t пшnЬ е r o f a r gumeп t s "
e ch o " U s a g e : add п аmе пшnЬ е r "
exit 1
fi
пате = $ 1
g rep " $ паmе " $ P HONEBOOK
i f [ $ ? -пе О ] ; theп
e cho "I c o u l dп ' t f i пd $ п аmе i п t h e рhопе boo k "
fi
$ cat rem
#
# Удали т ь абонента из телефонного спра вочника
#
паmе = $ 1
#
# Выя в и т ь коли ч е с т в о совпа вших записей
#
Переме н н а я РАТН 269
#
# Если с о впа вших з а писей бол ь ше одной , выв е с ти сообще ние ,
# а ина ч е - удалить з апись
#
В данном случае был применен еще оди н специальный прием. Ради большего
удобства для пользователей в конце программы 1 u была введена проверка с це
лью выяснить, успешно ли была выпол нена команда g rep. Если же поиск не дает
никаких результатов, то выводится соответствующее сообщение. А теперь про
верим программу rolo:
$ cd Перей ти в на чаль ный ка талог
$ rolo Liz Пр оизв е сти быстрый поиск
No phone b o o k f i l e in / u s e r s / s t e ve ! Fo r g o t to move i t
$ mv /users/ steve/bin/phoneЬook .
$ rolo Liz Попр обо в а ть еще р а з
Li z S t ac h i w 2 1 2 - 7 7 5 - 2 2 9 8
$ rolo Попр обо в а ть с в ыбор ом в ариа нта из ме ню
Wou l d you l i ke t o :
1 . L o o k s ome one up
2 . Add s ome on e to t h e phone b o o k
3 . Remo ve s ome one f rom t h e phone boo k
$ PHONEBOOK=$HOМE /phoneЬook
$ export РНОNЕВООК
$ lu Harmon
I c o u l dn ' t f i nd Ha rmon in t he phone b o o k
$
echo $ PWD
П е ре м ен на я CDPATH
Переменная CDPATH действует таким же образом, как и переменная РАТН. Она
определяет список каталогов, в которых оболочка производит поиск всякий раз,
когда выполняется команда cd. Такой поиск производится лишь в том случае,
если указанный каталог не задан по полному пути и если значение переменной
CDPATH оказывается непустым. Так, если ввести следующую команду:
cd /users/steve
оболочка сменит текущий каталог на /us e r s / s t eve . Но если ввести команду
cd memos
оболочка воспользуется значением переменной CDPATH, чтобы найти каталог
memo s . И если значение переменной C D PATH окажется следующим:
$ echo $CDPATH
. : / u s e r s / s t e ve : / u s e r s / s t e ve / d o c s
$
Ко ма нда
Чтобы разрешить упомянутую выше дилемму, в оболочке имеется команда
точка ( ), общая форма которой приведена ниже.
.
фа йл
Допол н ител ьн ые сведен и я об подоболочках 273
cd $ DATA
$
HOME = / u s r 2 / d a t a
B I N = $ HOME /Ь i n
R PT S = $ HOME / rp t s
DATA= $ H OME / rawda t a
РАТ Н = $ РАТ Н $ В I N
C D PATH= : $ HOME : $ RP T S
P S l = " DB : "
#
# Запустит ь н о в ую о боло ч ку
#
/Ьin/sh
$
HOME=/users/steve Экспортируемые
переменные Исходная
PATH =1usr/Ьin:steve/Ьi n � оболочка
PS 1 =$
•
BIN=/usr2/data/Ьin
г-::.
DATA=/usr2/data/rawdata 1
CDPAТН=:/usr2/data:/usr2/data/rpts Экспортируемые ...._
HOME=/usr2/data L...t
�
�
PATH=/Ьin:/usr/Ьin:/users/steve/Ьin::usr2/data/Ьin
PS1 =DB:
- ��""-""�"- -
RPTS=/usr2/data/rpts
•
BIN=/us'r2/data/Ьi n
DATA=/usr2/data/rawdata
CDPATH=:/usr2/data:usr2/data/rpts Экспортируемые
HOME=/usr2/data L...t переменные /usr/bln/sh
"'
PATH=/Ьin:/usr/Ьin:/users/steve/Ьin::/usr2/data/Ьi n
PSl =DB:
RPTS=/usr2/data/plus
Ко ма нда ехе с
Кон струкци и ( . . . ) и { . . . ; }
Иногда требуется сгруппировать вместе ряд команд. Например, программу
plotda ta требуется выполнить в фоновом режиме после программы s o r t. Но
эта задача никак не связана с каналом, а требует лишь выполнить ее одну за другой.
Оказывается, что ряд команд можно сгруппировать вместе, заключив их в кру
глые или фи гурные скобки. Первая конструкция приводит к выполнению команд
в подоболочке, а вторая конструкция - в текущей оболочке. Ниже приведены
некоторые примеры, демонстрирующие принцип действия этих конструкций.
$ x=SO
$ (x=l O O ) Выполнить эту строку в подо болочке
$ echo $х
50 Ни чего не изменилось
$ { x=l O O ; Выполнить эту с троку в текущей оболо чке
$ echo $х
100
$ pwd Определить ме с тона х ождение
/ u s e r s / s t e ve
$ (cd Ьin ; l s ) Перейти в ка талог bin и выполнить кома нду is
add
gree t ings
lu
numЬ e r
phoneboo k
rem
rolo
$ pwd
/ u s e r s / s t e ve Без изменений
$ { cd Ьin ; ) Это должно прив е сти к смене ка талога
$ pwd
/ u s e r s / s t e ve / b i n
$
ma i l op t = FALS E
i n t e r va l = 6 0
wh i l e g e t o p t s mt : op t i o n
do
c a s e " $ op t i o n "
in
m ) ma i l o p t =T RUE ; ;
t ) i n t e r va l = $ 0 PTARG ; ;
Допол н ител ьные сведен и я об подоболоч ка х 279
s h i f t count= $ ( ( OPT I N D - 1 ) )
s h i f t $ s h i f t count
user= $ 1
#
# Перене ст и в се после дующи е кома нды в фоновый режим
#
#
# Пр о вер я ть , заре г и с тр и р о в ал с я л и
# ука занный пол ь з о в а тель в с и с теме
#
#
# Е сл и программа дойде т до э т о го ме с та , зн а ч и т ,
# ука занный пол ь з о в а тель з а р е г и с трир о в ал с я в сис теме
#
f r e d h a s l og g e d on
Фа йл . pro file
В главе 2 пояснялась последовательность входа в систему, выполняемая пре
жде, чем оболочка отобразит приглашение на ввод команд. Но перед выводом
такого при глашения оболоч ка производит поиск в системе и чтение двух специ
альных файлов.
Первым из них является файл / e t c / p r o f i l e , настраиваемый системным ад
министратором. Как правило, в этом файле организуется проверка сообщений,
поступивших по электронной почте с выводом сообщения " You have ma i l "
(У вас есть почта); задается используемая п о умолчанию маска создания файлов
пользователем, сокращенно называемая umask; устанавливается стандартное зна
чение переменной РАТН и делается все остальное, что должно произойти при вхо
де пользователя в систему, как считает ее администратор.
Но еще больший интерес представляет второй файл . pro f i l e , автомати
чески выполняемый в начальном каталоге пользователя. В большинстве систем
Unix стандартный файл . p ro f i l e устанавливается при создании учетной запи
си пользователя. Итак, приступим к анализу его содержимого. Ниже приведен
пример довольно скромного файла . pro f i l e , где просто устанавливается и экс
портируется переменная РАТН.
$ cat $HOМE/ . profile
РАТ Н = " / b i n : / u s r / Ь i n : / u s r / l Ь i n : . : "
expo r t РАТН
$
как только вы войдете в систему. Это также означает, что изменения, которые вы
вносите в файл . p ro f i l e для настройки своей среды, остаются до тех пор, пока
вы не выйдете из оболочки.
Большинство пользователей Unix обращаются к своему файлу pro f i le, что
.
P S l = 11 = > 11
P S 2 = 11 = = = = > 11
s t t y e c h o e e r a s e C TR L - h
e cho
greet ings
$
l o g i n : s teve
P a s sword :
Good mo r n i ng Вывод приве тствия из проrраммы gree tings
=> Нов о е приглашение из переменной PSl
П е р е м е н н а я ТЕRМ
И хотя многие команды и программы (вроде l s и e cho ) в системе Unix опи
раются на режим командной строки, имеется целый ряд полноэкранных команд
(вроде vi ) , требующих доскональных знаний настроек и возможностей термина
ла. Подобная информация хранится в переменной окружения ТЕRМ и обычно не
требует вашего внимания, поскольку программа Terminal или SSH автоматически
устанавливает в этой переменной такое оптимальное значение, чтобы все работа
ло без сучка и задоринки.
Тем не менее некоторые пользователи по старинке считают, что в переменной
ТЕRМ требуется установить конкретное значение вроде ans i , vt l O O или xte rm,
чтобы полноэкранные программы работали надлежащим образом. В подобных
случаях переменную ТЕRМ рекомендуется настраивать в файле p ro f i l e . .
Написав несложный блок кода, можно даже вывести приглашение н а ввод зна
чения переменной ТЕRМ в процессе регистрации в системе, как показано ниже.
Переменная TZ 283
П е ре м е н н а я т z
Перемен ная T Z применяется в команде dat e и некоторых стандартных функ
циях из библиотеки С для определения текущего часового пояса. Безусловно,
пользователи могут удаленно регистрироваться в системе через Интернет, и по
этому вполне возможно, чтобы разные пользователи системы работали в разных
часовых поясах. В переменной Т Z проще всего установить наименование часо
вого пояса с помощью трех или больше буквенных символов и числа, обознача
ющего количество часов, которые требуется прибавить к местному времени для
достижения всемир ного скоор динир ованного времени (UTC), называемого также
временем по Гринвичу. Это число может быть как положительным, когда местный
часовой пояс находится на запад от нулевого меридиана, так и отрицательным,
когда местный часовой пояс находится на восток от нулевого меридиана. Напри
мер, восточное поясное время в Северной Америке может быть указано следую
щим образом:
TZ=ESTS
После числа, обозначающего часовой пояс, может быть также указано вто
рое наименование часового пояса. И если оно указано, то предполагается летнее
время, которое автоматически корректируется в команде da te при переходе на
летнее время, т.е. на оди н час вперед от стандартного времени. Если после этого
числа следует наименование часового пояса с учетом перехода на летнее время, то
это значение используется для вычисления летнего времен и, исходя из всемирно
го скоординированного времени, таким же образом, как и описанное выше число.
Чаще всего часовой пояс обозначается как E S T 5 E DT или MST 7MDT с учетом
перехода на летнее время, хотя этот переход происходит не во всех странах. Пере
менная TZ обычно устанавливается в файле / e t c /pro f i l e или . p ro f i le. Если
она не установлена, то для конкретной реализации используется стандартный ча
совой пояс - как правило, всемирное скоорди н ированное время.
Следует также иметь в виду, что для установки часового пояса во многих си
стемах Linux может быть указана конкретная географическая местность. Так, в
следующем примере устанавливается текущее время в Тихуане, Мексика:
T Z = "Ame r i c a / T i j u a n a " d a t e
...L
По команде
$ { E D I TOR : - / b i n / e d } / trnp / e d f i l e
запускается программа, имя которой хранится в перемен ной E D I TOR (это, веро
ятно, текстовый редактор) , а если значение переменной E D I TOR оказывается пу
стым, запускается программа, доступная по пути / Ь i n / e d.
Однако это не приводит к изменению значения переменной. Поэтому даже по
сле выполнения приведенной выше команды переменная E D I TOR будет и далее
иметь пустое значение, если оно было таковым изначально. Ниже приведен про
стой пример, демонстрирующий применение рассматриваемой здесь конструк
ции.
$ EDITOR=/bin/ed
$ echo $ { EDITOR : - /bin/vi }
/Ьin/ed
$ EDITOR= Уста но в ить пустое зна чение да нной пе� еменной
в
$ echo $ { EDITOR : - /bin/vi }
/Ьin/vi
$
Подстановка значен и й параметров 287
if [ $ { f i l e . о } ! = $ f ile ] ; then
# файл о канч и в ае тс я н а . о
fi
Эта программа отображает свой аргумент, где удалены все символы вплоть до
последнего знака / :
$ mybasename /usr/ spool/uucppuЫic
uu cppuЬ l i c
$ mybasename $НОМЕ
s teve
$ myЬaзename memos
memo s
$
Со в ет
Все конструкции для подста новки значен и й п а ра м етров, оп ис ы ваем ые в этой гла ве , пере
ч ислены в табл . А.З п риложен ия А.
'
П е р е м ен н а я $о
Всякий раз, когда выполняется программа оболочки, имя этой программы со
храняется оболоч кой в специальной перемен ной $ О . Это может быть удобно в са
мых разных случаях, в том числе и тогда, когда программа доступна под разными
именами команд по жестким ссылкам в файловой системе. Это дает возможность
выяснить программным путем, какая именно команда была выполнена.
292 Гл а в а 1 1 . Допол н ител ьн ы е сведен ия о параметрах
n ame = $ 1
g r e p " $ n ame " $ PHONE BOOK
if $ ? -ne О ] ; t h e n
e c h o " I c o u l dn ' t f i nd $ n ame i n t h e p h o n e b o o k "
fi
$ PHONEВOOK=$HOМE/phoneЬook
$ export PHONEBOOK
$ lu Teri
Te r i Z a k 2 0 1 - 3 9 3 - 6 0 0 0
$ l u Teri Zak
I nc o r r e c t n umЬ e r o f a rgume n t s
U s a g e : l u n ame
$ mv lu lookup Переимен о ва ть пр о rр а мму
$ lookup Teri Zak Выя снить , ч т о произойд е т т еперь
I n c o r r e c t n umЬe r o f a r gumen t s
U s a g e : l o o kup n ame
$
К о м а нда s e t
Доступная в оболочке команда s e t служит двум целям: для установки различ
ных параметров оболочки и переназначения позиционных параметров $ 1 , $2 и т.д.
Кома нда set 293
П а р аметр -х
то активизируется режим трассировки, а это означает, что данные обо всех вы
полняемых далее командах будут направлены оболочкой в стандартный вывод
ошибок после имени файла, переменной и подстановки команд, а также осущест
вляемой переадресации ввода-вывода. Имена трассируемых команд предваряют
ся знаками "плюс'', как демонстрируется в следующем примере:
$ х=*
$ set -х Ус тано ви ть р ежим тра с сиров ки кома нд
$ echo $х
+ echo add g r e e t i ng s lu rem r o l o
add g r e e t i n g s l u r e m r o l o
$ cmd=wc
+ cmd�wc
$ ls 1 $cmd -1
+ ls
+ wc - 1
5
$
LOGNAМE = s t e ve
МA I L= / u s r / spoo l /rna i l / s t e ve
МА I LСНЕСК= б О О
PAT H = / Ь i n : / u s r /b i n : / u s e r s / s t e ve / b i n : . :
PHONEBOOK= / u s e r s / s t e ve /phoneboo k
PS1=$
PS2=>
PWD= / u s e r s / s t e ve /rni s c
SHELL= / u s r /Ь i n / s h
T E RМ= x t e rrn
TMOU T = O
T Z =E S T 5 E DT
crnd=wc
х=*
$
read l i ne
s e t $ l ine
echo $ #
$ words Выполнить программу
Here ' s а line for you to count .
7
$
Па р ам етр - -
Описанный выше способ вполне работоспособен. Но что, если пользователь
начнет по какой - н ибудь причине ввод дан ных со знака ? Рассмотрим следующий
-
пример:
296 Гл а в а 1 1 . Допол н ител ь н ы е сведен ия о параметрах
$ words
-1 + 5 4
wo rds : - 1 : bad opt i o n ( s )
$
В данном случае произошло следующее: после того, как введен ная пользова
телем строка была прочитана и присвоена переменной l i ne, в оболоч�е была
выполнена приведенная ниже команда.
s e t $ l in e
LOGNAМE = s t e ve
МA I L = / u s r / sp o o l /rna i l / s t e ve
МA I LCHECK= 6 0 0
PAT H = / b i n : / u s r / b i n : / u s e r s / s t e ve / b i n : . :
PHONEBOOK= / u s e r s / s t e ve / phonebo o k
PS1=$
PS2=>
PWD= / u s e r s / s t e ve /mi s c
S H E L L= / u s r / b i n / s h
TERМ= x t e rm
TMOU T = O
T Z = E S T 5 E DT
cmd=wc
х=*
о
$
Если дополн ить программу words циклом whi l e, где выполняется вполне
определенная целочисленная арифметическая операция, как показано ниже, эта
программа сможет подсчитывать общее количество слов, прочитанных из стан
дартного ввода. По существу, она станет разновидностью команды wc -w.
$ cat words
#
# П одсчитат ь в се с л о в а , прочитанные из стандартно го в вода
#
count = O
wh i le r e a d l i ne
do
set - - $ l i ne
coun t = $ ( ( count + $ # ) )
done
e cho $ c ount
$
П е р е м е н н а я I FS
В оболочке имеется специальная переменная I FS, сокращенное имя кото
рой обозначает внутренний разделитель полей (internal field separator). Значение
этой переменной употребляется в оболочке при синтаксическом анализе ввода
из команды re ad, вывода из команды, подставляемой с помощью механизма об
ратных кавычек, а также при подставке значений переменных. Короче говоря,
переменная I FS содержит ряд символов, употребляемых в качестве пробельных
разделителей. Если эта перемен ная введена в командной строке, оболочка интер
претирует ее значение как пробельный символ, обыкновенно применяемый для
разделения слов.
Приведенное выше пояснение назначения переменной I FS может показать
ся не вполне вразумительным! Следовательно, чтобы выяснить, какие же имен
но символы хранятся в данной перемен ной , ее значение достаточ но передать по
каналу из команды e cho команде od (т.е. восьмеричный вывод содержимого) с
параметром -Ь (т.е. побайтовое отображение), как показано ниже.
Пе ременная I FS 299
$ echo $z
678
$ list="one : two : three "
$ for х in $list ; do echo $х ; done
one
two
three
$ var=a : b : c
$ echo "$var "
а:Ь:с
$
$ cat numЬer2
#
# Пронумерова т ь с тро ки , введенные из файла , заданного
# в каче стве ар гуме нт а , или и з с т андартно г о в в ода , е сли
# файл не ука зан - окон чатель на я верси я
#
# Видоизме нит ь содержимое переме нной IFS , что бы
# со храни т ь началь ные пробелы при в воде с тр о к
I FS = '
# В ка выч ки з а ключа е т с я лишь зн а к но вой с тро ки
l i neno = l
cat $* 1
wh i l e read - r l i ne
do
p r i n t f " 'l, Sd : 'li s \ n " $ l i n e n o " $ l i n e "
l i ne n o = $ ( ( l i n e n o + l ) )
done
К ом а нда readonly
Эта команда применяется для обозначения тех переменных, значения которых
не подлежат последующему изменению. Например, в следующей команде:
r e adon l y РАТН НОМЕ
302 Гл а в а 1 1 . Допол н ител ьн ы е сведе н и я о п а ра метрах
К о м а нда uns e t
Иногда требуется удалить определение переменной и з своей среды. С этой це
лью достаточно ввести команду uns et, указав далее имена перемен ных:
$ x=lO O
$ echo $ х
100
$ unset х Уда лить переменную х из текущей среды
$ echo $х
$
К о м а нда eval
В этом разделе описывается eva l одна из самых необычных команд обо
-
где кома ндна я_ стр ока это обычная командная строка, вводимая с термина
-
ла. Но если указать такую командную строку после команды eva l , то оболоч ка
просмотрит ее два жды, прежде чем выполнять ее. Это может быть удобно, если в
сценарии составляется команда, которую, помимо всего прочего, требуется вы
звать.
В простейшем случае применение команды eva l не дает н икакого эффекта,
как демонстрируется в следующем примере:
$ eval echo hel lo
he l l o
$
Знак обратной косой черты удаляется оболочкой после первого просмотра ко
мандной строки. А при втором ее просмотре оболочка подставляет сначала значе
ние позиционного параметра $ 4, а затем выполняет команду e cho.
Тем же самым способом можно было бы воспользоваться и в том случае, если
бы в командной строке имелась переменная a rg, содержавшая, например, цифру,
и при этом требовалось отобразить позиционный параметр по ссылке на пере
менную arg. В таком случае можно было бы написать следующую строку:
e va l e cho \ $ $ a r g
К ом а нда wai t
Если перенести команду на выполнение в фоновый режим, она будет выпол
няться в подоболочке независимо о т текущей оболочки (в этом случае говорят,
что задание выполняется асинхронно) . Но иногда требуется подождать завер
шения фонового процесса, называемого также порожденным, поскольку он по
рожден родительским процессом в текущей оболочке, прежде чем продолжить
выполнение. Например, круп ное задание по сортировке может быть отправлено
на выпо!1 нение в фоновый режим, а для доступа к отсортированным данным при
дется ждать завершения этого задания. Именно для этого и предн азначена коман
да wa i t, общая форма которой выглядит следующим образом:
wa i t идентифика тор_ проце сса
где идентифика тор_ пр оце сса обозначает тот процесс, завершения которого
требуется подождать. Если идентификатор процесса не указан, оболочка ожида
ет завершения всех порожденных процессов. В этом случае выполнение текущей
306 Гл а в а 1 2 . Невыяснен ные воп рос ы
П еремен н а я $ !
Если в фоновом режиме выполняется лишь оди н процесс, то для ожидания его
завершения достаточно указать команду wai t без аргументов. Но если в фоно
вом режиме выполняется несколько процессов и требуется подождать заверше
ния только того процесса, который был запущен самым последним, то для досту
па к его идентификатору можно обратиться к специальной переменной $ ! . Таким
образом, следующая команда:
wa i t $ !
prog2 &
pid2=$ !
К о м а нда trap
Когда вы нажимаете клавишу <DELETE> или <BREAK> на терминале во время
выполнения программы, ее выполнение, как правило, приостанавливается и вы
Ком анда tra p 307
где кома нды обозначает одну или больше команд, которые будут выпол няться
всякий раз, когда получаются указанные сигналы
Наиболее употребительные мнемонические имена и номера, присваиваемые
разным типам си гналов, перечислены в табл . 1 2. 1 . Более полный их перечень
можно найти в описании команды t r ap, приведенном в приложении А.
Табли ца 12 . 1. Наиболее употребительные
мнемон ические имена и номера с и гналов
Сигнал номер 1 ( S I GHUP или просто HUP) генерируется при зависании про
граммы. Первоначально это было связано с установлением коммутируемых со
единений, но теперь это, как правило, означает неожиданный разрыв соединения,
аналогичного подключени ю к Интернету. Так, если вернуться к приведенному
выше примеру команды t r ap, то, добавив сигнал S I G I NT (или просто I N�) в пе
речень сигналов, оба указанных в ней файла можно удалить и в случае зависания,
как показано ниже. Если теперь линия связи зависнет или же пользователь пре
рвет обработку, нажав клавишу < DELETE> или комбинацию клавиш <Ctrl+c>,
оба указанных файла будут удалены.
t rap " rm $ WORKD I R / wo r k l $ $ $WORKD I R / d a t a o u t $ $ ; e x i t ' ' INT HUP
Команда t rap может быть использована и для того, чтобы сделать разрабаты
ваемые программы более удобными для пользователей. Так, при рассмотрении
программы rolo в следующей главе в нее будет внесено изменение, предусма
тривающее перехват сигнала при нажатии комбинации клави ш <Ctrl+c>, а также
возврат к основному меню пользователя, а не к полному выходу из программы.
И г но р и р о в а н и е си г на л о в
Если в команде t rap указан пустой список команд, заданный сигнал будет
проигнорирован при его получении. Например, в команде
11 11
t r ap S I G I NT
Сбр о с п рер ы в а н и й
Если действие, предпринимаемое по умолчанию при получении сигнала, было
изменено, его можно восстановить по команде t r ap, опустив в ней первый аргу
мент. Таким образом, по следующей команде:
t r ap HUP I NТ
Д о п ол н ит е л ь н ы е св еден и я
о б о р га н и з а ц и и в в ода- в ы вода
Как известно, стандартные конструкции <, > и >> служат для переадресации
ввода, вывода и вывода с присоединением соответственно. Известно также, что
стандартный вывод ошибок можно переадресовать из любой команды, просто
указав 2> вместо > в следующей конструкции:
кома нда 2 > фа йл
At t e n t i o n :
END-OF- DATA
$
$ foobar
Wed Oct 2 1 5 : 2 3 : 1 5 E DT 2 0 0 2
$
$ cat rolosuЬs
#
# Архив ный файл программ, приме н яемых в про грамме rolo
#
e cho E x t r ac t i n g l u
c a t > l u < < \ T H E - E N D - O F - DATA
#
# Найти абонента в теле фонном справочнике
#
n ame = $ 1
g rep " $ name " $ PHONEBOOK
i f [ $ ? -ne О
then
e ch o "I co u l dn ' t f i nd $ n ame i n the phone bo o k "
fi
T H E - E N D-OF- DATA
e c h o E x t r a c t i n g add
cat > a dd < < \ T H E - EN D-OF- DATA
#
# Программа дл я в в ода абонента в телефонный спра в очник
#
echo E x t r a c t i ng rem
c a t > rem < < \ T H E - E N D - O F - DATA
#
# Удали т ь абонента из телефонн о г о справочника
#
316 Гл а в а 1 2 . Невыяснен н ые во п росы
n ame = $ 1
#
# Н ай ти кол и че с т в о с о вп а вших записей
#
#
# Если обнаружена не одна совпа вшая з а пи с ь ,
# вьщат ь соо бщение , а и н а че удал и т ь н айденную з ап ис ь
#
Для большей полноты этот архивный файл должен также включать в себя про
грамму r o l o , но в данном примере она в него не включена ради экономии ме
ста. В данном случае составлен единый переносимый архивный файл оболоч ки
r o l o s ub s , который содержит исходный текст всех трех программ lu, add, rem и
может быть отправлен кому- нибудь другому по команде ma i l , как демонстриру
ется в следующем примере:
$ mai l tony@ ai systems . com < rolosuЬs Отпра вить архив ный фа йл
по электронной по чте
$ mai l tony@ ai systems . com Отпра вить по электронной
по чте со о бщение
поль зов а телю tony
Tony ,
I mai led you а shell archive containing the programs
lu , add , and rem . rolo i tself will Ье sent along shortly .
Pat
<Ct r l + d>
$
До пол н ител ьн ы е сведе н ия об орга н иза ци и в вода - в ы вода 317
for fi l e
do
echo
echo " e ch o E x t r ac t i ng $ f i l e "
echo " c a t > $ f i l e < < \ T H E - E N D - O F - DATA "
cat $ f i l e
echo " T H E - E ND - OF - DATA "
done
Фун кци и
Во всех современных оболочках поддерживаются функции - длинные или ко
роткие последовательности команд, на которые можно ссылаться или повторно
использовать как угодно часто в программе оболочки. Для определения функции
'
служит следующая общая форма:
имя ( ) { кома нд а ; кома нда ;
$ dЬ ( ) {
> РАТН=$РАТН : /uxn2 /data
> PSl=DB :
> cd /uxn2/data
> }
$ dЬ Вып олнить эту функцию
DB :
mycd ( )
{
if $ # - le 1 ] ; then
# обычный случай О и л и 1 ар гумен т
cd $ 1
e l i f [ $ # -eq 2 ] ; then
# особый случай - з аме на аргумен т а $ 2 на $ 1
cd $ ( e cho $ PW D 1 s e d " s l $ l i $ 2 1 " )
e l se
# у команды cd може т быть не бол ь ше двух аргуме нто в
e c h o mycd : b a d a r gume n t c o u n t
exit 1
fi
320 Гп а в а 1 2 . Н евыясненные воп росы
#
# Функци я для в вода а боне нта в телефонный спра вочни к
#
add () {
# в в е сти зде с ь команды из программы add
#
# Функци я для пои ска абонента в теле фонном с пр а в очнике
#
lu ( ) {
# в в е с ти зде с ь команды из программы lu
#
# Фун кция для удале ни я абон ента из телефонного спр авочника
#
rem () {
# в в е сти зде с ь команды из про граммы rem
Ком а нда type 321
#
# rolo - про грамма дл я пои с ка , в в ода и удале ния
# с в е де ний об а бо не н т а х из телефон н ого с пр а в о чн и ка
#
Unix или даже псевдонимом оболочки. Именно здесь и приходит на помощь ко
манда type, которая принимает в качестве своего аргумента имена одной или
нескольких команд и сообщает, что именно ей известно о них. Ниже приведены
некоторые примеры применения команды t ype.
$ nu () { who 1 wc - 1 ;
$ type pwd
pwd i s а s he l l bu i l t i n
$ type ls
ls is a l i a s e d to ' / b i n / l s - F '
$ type cat
cat i s /Ьin/cat
$ type nu
nu i s а func t i o n
$
j
Во з р ащение
к пр огр амме ro l o
В оп ро сы ф о р м а ти ров а н и я да н н ы х
Несмотря на все удобства, которые предоставляет программа r o l o для ве
дения телефон ного справочника, рассматривавшаяся ранее в данной книге, она
была бы, несомненно, более удобной, если бы позволяла хранить в телефонном
справочнике не тол ько имена абонентов и номера их телефонов. В частности,
было бы неплохо, если бы данная программа позволяла создавать в телефонном
справоч нике почтовые и электронные адреса абонентов. Новая версия програм
мы r o l o, рассматриваемая в этой главе, допускает сохранять в телефонном спра
вочнике записи, состоящие из нескольких строк. Н иже приведен пример такой
записи.
S t eve ' s I ce C r e am
4 4 4 6 t h Avenue
New Y o r k C i t y 1 0 0 0 3
2 12-555-302 1
данный символ не может быть использован как составная часть самой записи.
Таким образом, первая запись, которую можно было бы сохранить подобным
способом в файле телефонного справочника, выглядела бы следующим образом:
S t e ve ' s I ce C reamл 4 4 4 б t h Avenue лNew Y o r k C i t y 1 0 0 0 З л 2 1 2 - 5 5 5 - 3 0 � 1 л
П ро гра м м а ro lo
Ниже приведен исходный текст программы rolo.
#
# rolo про грамма дл я поиска , в вода и удаления
-
#
# Установить в переменной PHONEBOOK пут ь к файлу
# телефонно го справ очника и э к спортиро в а т ь е е , чт обы
# сдел а т ь ее до с тупной дл я других про грамм . Если она
# установлена и значал ь н о , о с т а ви т ь е е б е з и зме нения
#
#
# Е сли предо ста влены ар гументы , то прои з в е с ти пои с к
#
П рогра м м а rolo 325
#
# Ус тановить сигнал прерыв ания ( при нажа тии кл а виши < DELETE > ) ,
# чтобы продолжи т ь выполнение цикл а
#
# Выполнять цикл до т е х пор , п о ка пол ь з о ватель н е
# выберет вариант ' e x i t ' , т . е . выход и з про граммы
#
wh i l e t ru e
do
#
# Отобразить меню
#
echo '
Wou l d you l i ke t o :
1. L o o k s ome one up
2 . Add s ome one to the phone boo k
3 . Remo ve s ome o n e f r om t he phone bo o k
4. Change a n e n t r y i n t h e phone b o o k
5. L i s t a l l n ame s and nWТlЬe r s i n t h e p h o n e boo k
6. E x i t t h i s p r o g r am
#
# Прочи т а т ь и обраб о т а т ь р е з ул ь т а т выбора
#
read cho i ce
echo
c a s e " $ ch o i ce "
in
1 ) e c h o " En t e r n ame to l o o k up : \с"
read name
read name
i f [ - z " $ narne " ] ; then
echo " Rernova l igno red"
else
rern " $ narne "
fi; ;
П ро г ра м м а add
Ниже приведен исходный текст программы add.
#
# Пр о грамма для в в ода а бо н е н та в т еле фонный спра вочни к
#
first=
e n t r y='
wh i l e t rue
do
e cho " > > \ с "
r ead l i ne
Эта программа вводит запись в телефонный справоч ник. Она постоянно вы
водит для пользователя приглашение на ввод строк до тех пор, пока он не завер
шится нажатием клавиши <Eпter>, т.е. совершенно пустой строкой . Каждая вво
димая строка присоеди няется к значению переменной ent ry, где специальный
символ л служит для логического разделения полей. При выходе из цикла wh i l e
в телефонный справочник вводится новая запись и сортируется файл этого спра
воч ника.
П ро гра м м а lu
Ниже приведен исходный текст программы l u.
#
# Найти абонента в т еле фонном спра в очни ке
#
wh i l e read l ine
do
d i s p l a y " $ l i ne "
done < / tmp /ma t che s $ $
fi
rm / tmp /matche s $ $
П ро гра м м а di splay
Ниже приведен исходный текст программы d i s p l ay.
#
# Отобра ж ение записи и з теле фонного с пра в очни ка
#
echo
echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
entry = $ 1
I FS= ll Л ll
set $entry
for l i ne in " $ 1 " " $ 2 " " $ 3 " " $ 4 " " $ 5 " " $ 6 "
do
p r i n t f " 1 % - 3 4 . 3 4 s l \ n " $ l ine
done
e cho " 1 о о 1"
echo 11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
echo
В программе d i s p l ay отображается разделяемая знаком л запись, передава
емая данной программе в качестве аргумента. Чтобы сделать вывод из нее эсте
тически более привлекательным, данная программа фактически "воспроизводит"
карточку из вращающегося каталога типа rolodex. Типичный результат, выводи
мый И з программы di s pl a y, выглядит следующим образом:
о о
330 Гл а в а 1 3 . В озращение к п рограмме rolo
а переменной $ 4 значение 2 1 2 - 5 5 5 - 3 0 2 1 .
-
П ро г ра м м а rem
Ниже приведен исходный текст программы rem.
#
# Удал ит ь абоне н т а и з теле фонного с п р а в очни ка
#
name= $ 1
#
# Получ ит ь с о в па вшие з а писи и сохранит ь их во вре менном фа йле
#
#
# Отобра зить с о в па в шие з аписи по о ч е реди и
# подт в ерди ть и х удале н ие
#
wh i le read l i ne
do
d i s p l a y " $ l i ne "
e cho " Remove t h i s en t r y ( y /n ) ? \ с "
read an s we r < /dev / t t y
П ро гра м м а change
Н иже приведен исходный текст программы change.
#
# Изме ни т ь запи с ь в телефонном спра в очни ке
#
n ame=$ 1
#
# Получит ь с о впавшие записи и сохрани т ь их во време нном фа й ле
#
#
# О т образи ть с о в па вшие записи по очере ди и
# подт в ерди т ь их и змен е ние
#
wh i l e read l i ne
do
d i s p l a y " $ l i ne "
e cho " Change thi s e n t r y ( y / n ) ? \ с "
read answe r < /de v / t t y
rm / tmp /matche s $ $
П рограмма cha nge 333
#
# Запустить редактор с подт вержденной записью
#
#
# Удалит ь теперь прежнюю з апись и в в е с ти новую
#
П ро г ра м м а l i s ta l l
Ниже приведен исходный текст программы l i s t a l l .
#
# Перечисли т ь все записи в т елефонном справочнике
#
I FS= ' л ' # служит для применения в ука занной ниже команде set
echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "
wh i l e read l i ne
do
#
# Получит ь первое и последнее поля , вероятно ,
# содержащие имена абонен т ов и номера т елефонов
#
s e t $ l ine
#
# Ото б рази т ь первое и последнее поля ( в обра т ном поряд к е ! )
#
eval p r i n t f " \ " % - 4 0 . 4 0 s % s \ \ n \ " " " \ " $ 1 \ " " " \ " \ $ { $ # } \ " "
done < $ PHONE BOOK
echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Wou ld you l i ke t o :
l . Lo o k s ome one up
2 . Add s ome one to the phone book
3 . Remove s omeone f rom the phone boo k
4 . Change an e n t r y i n the phone boo k
5 . L i s t a l l name s and numЬe r s in the phone
6 . E x i t th i s prog ram
Wou ld you l i ke t o :
>>
>>
Wou ld you l i ke t o :
Wou ld you l i ke t o :
Wou l d you l i ke t o :
Maureen Conne l l y
Hayden Boo k Companu
1 0 Mu lhol land D r i ve
Hasbrouck He i gh t s , N J 07604
2 01-555-6000
о о
Teri Z a k
Hayden Boo k Company
( s ee Mau reen C onne l ly for addre s s ) 1
201-555-6060 1
1
о о 1
Wou ld you l i ke t o :
Maureen Conne l l y
Hayden Boo k Companu
10 Mu l ho l l and Dr i ve
Hasb rouc k Height s , NJ 07604
201-555-6000
о о
Change t h i s pe r s on ( y/ n ) ? у
En te r change s w i t h / b i n / e d
101
1 , $р
Maureen Conne l l y
Hayden Boo k Companu
10 Mu l ho l l and Drive
Hasbrouc k He ight s , N J 07604
20 1-555-6000
338 Гл а в а 1 3 . В озращен ие к п рогра м м е rolo
101
q
Wou ld you l i ke t o :
В этой главе речь пойдет о средствах оболоч ки, удобных для интерактивного
взаимодействия с пользователями и не являющихся частью стандарта POSIX на
оболочку. Эти средства доступны в двух оболочках, Bash и Korn, которые явля
ются наиболее распространенными среди несовместимых со стандартом POSIX
оболочек в системах Unix, Linux и Мае OS.
Оболочка Korn была разработана Дэвидом Корном (David Korn) из компании
АТ&Т Bell Laboratories и предназначена для "восходящей совместимости" с обо
лоч кой System V Bourne и оболочкой по стандарту POSIX. Она широко доступна
на всех главных платформах Un ix, и если у вас имеется доступ к командной стро
ке, то вам, вероятнее всего, доступна и оболочка Korn в форме k s h.
Оболочка Bash (сокращение от Bourne-Again Shell - "Возрожденная" оболоч
ка Борна) была разработана Брайаном Фоксом (Brian Fox) для Фонда свободного
программного обеспечения ( Free Software Foundation). Она была предназначена
для совместимости с оболочкой System V Bourпe и стандартной оболочкой POSIX
и дополнительно содержит многие расширения из оболочек Korn и С. Оболочка
Bash является стандартной в системах Liпux и большинстве современных систем
Uпix и Мае OS, где она была заменена оболочкой Bourne. (На самом деле, если вы
пользуетесь оболочкой s h, то, вероятнее всего, пользуетесь и оболочкой b a s h,
даже не подозревая об этом.)
За исключением нескольких малозначительных отличий, оболочки Bash и the
Korn предоставляют все средства, доступные в оболочке по стандарту POSIX, а
также немало новых средств. Чтобы дать ясное представление о совместимости
этих об олочек со стандартом POSIX, все программы, представленные в данной
книге, вполне работоспособны и в оболочке Bash, и в Korn. В этой главе особое
внимание уделяется любым нестандартным средствам, а в ее конце и в табл. 1 4.4
перечислены те средства, которые поддерживаются в разных оболочках.
В ыб о р п од х одя ще й о б олоч к и
В рассмотренных до сих пор примерах программ все команды размещались
в файле, который выполнялся как программа оболочки. При этом вообще не
340 rл а в а 1 4 . И нтера кти в н ы е и неста нда ртн ые средства оболочки
Фа й л ENV
Когда оболочка запускается, она, прежде всего, обнаруживает среду, указан
ную в переменной ENV. Если значение этой переменной оказывается непустым,
то выполняется файл, указанный в переменной ENV, подобно файлу pro f i l e .
при входе в систему. Файл ENV содержит команды для установки среды оболочки.
В этой главе упоминаются различные элементы, которые должны быть включены
в данный файл.
Фа йл ENV 341
Если решить, что файл ENV необходим, то переменную ENV следует установить
и экспортировать в файле pro f i l e следующим образом:
.
$ cat . profile
П р еды сто р и я ко м а н д
Независимо от того, какая именно оболочка применяется, в ней ведется пре
дыстория всех вводившихся ранее команд. Всякий раз, когда вы нажимаете кла
вишу <Enter>, чтобы выполнить введенную команду, эта команда добавляется в
конце списка предыстории. В зависимости от сделанных вами установок ваша
предыстория команд может быть даже сохранена в файле и восстановлена в про
межутке между сеансами регистрации в системе, чтобы у вас была возможность
быстро получить доступ к командам из предыдущих сеансов работы в системе.
По умолчанию список предыстории команд хранится в файле sh h i s tory . _
логе текущего пользователя. Имя этого файла можно изменить как угодно, уста
новив его в переменной H I ST F I LE. Эту переменную можно устанавливать и экс
портировать в своем файле p ro f i le . .
ющим образом:
$ grep HISTSIZE . profile
Н I ST S I Z E= S O O
expo r t Н I ST S I Z E
$
Р е ж и м п ра в к и ст ро к в ред а кторе vi
Включив режим правки строк в редакторе vi, вы можете ввести все последу
ющие команды в привычном для пользователей редактора vi режиме ввода. Ве
роятно, вы даже не заметите н и каких отличий, поскольку сможете вводить и вы
полнять команды точ но так же, как и по стандартному приглашению в оболочке:
$ set - о vi
$ echo hello
he l l o
$ pwd
/users /pat
$
Чтобы воспользоваться построчным редактором, вам придется перейти в ко
манднь1й режим, нажав клавишу <ESCAPE> (или <ESC> ), которая обычно рас
полагается слева вверху на клавиатуре. Как только вы перейдете в командный ре
жим, курсор сместится на одну позицию влево к символу, введен ному последним.
Текущим оказывается тот символ, на котором находится курсор. Подробнее
о текущем символе речь пойдет несколько позже. Команды редактора v i можно
вводить только в командном режиме, где они интерпретируются немедленно по
сле их ввода, не требуя нажатия клавиши <Enter>.
Характерное затруднение, которое может возн икнуть при вводе длинных ко
манд, заключается в том, что ошибка обнаруживается только после ввода всей
команды. И зачастую такую ошибку совершают в начале строки!
В командном режиме можно перемещать курсор и исправлять ошибки, не об
ращаясь непосредственно к командной строке. Переместив курсор на место об
наруженной ошибки, можно заменить одну или несколько букв на все, что угод
но. И как только будет нажата клавиша <Enter> (независимо от местоположения
курсора в строке), введен ная команда будет передана оболочке для последующей
интерпретации.
344 Гл а в а 1 4 . И нтеракти вные и неста нда ртн ые средства оболоч ки
Как видите, команду х можно также предварить числом, чтобы указать коли
чество удаляемых символов. Чтобы переместить курсор в конец строки, доста
точно ввести команду $ , а в начало строки - команду О (т.е. нуль):
$ had а l i t t l e l amЬda $ $ had а l i t t l e l amЬda
$ had а l i t t. l e l amЬda О $ had а l i t t l e l amЬda
Ко ма нда Назначение
h Переместить курсор на один символ влево
1 Переместить курсор на один символ вправо
ь Переместить курсор на одно слово влево
w Переместить курсор на одно слово вправо
о Переместить курсор в начало строки
$ Переместить курсор в конец строки
х Удалить символ на позиции курсора
dw Удалить слово на позиции курсора
rc Заменить на с символ на позиции курсора
а Перейти в режи м ввода и ввести текст после текущего символа
i Перейти в режим ввода и ввести текст до текущего символа
k Получить предыдущую команду из предыстории
j Получить следующую команду из предыстории
/ C!lpOICa Н айти в предыстории самую последнюю команду, содержащую указанную
с!!роху, если указанная C!lpOxa оказывается пустой, будет использована
предыдущая строка
Р е ж и м п ра в к и ст ро к в р е да кто ре emacs
'
hello
$ pwd
/ u s e r s /pat
$
руется в приведенном ниже примере. Следует, однако, иметь в виду, что для вы
полнения подобных команд следует сначала нажать и отпустить клавишу <Esc>,
а затем нажать соответствующую клавишу ( <f>, <Ь> и т.д.) .
$ ma r y had а l i t t le l amЬda Esc ь $ ma r y had а l i ttle l amЬda
$ ma r y had а l i t t le l amЬda Esc ь $ ma r y had а l i t t l e l amЬda
$ ma r y had а little l amЬda Esc ь $ ma r y had .§. l i t t l e l amЬda
$ ma r y had а l ittle l amЬda Esc f $ ma r y had а l i t t l e l amЬda
$ ma r y had а l ittle l amЬda Esc f $ ma r y had а l i t t l e l amЬda
Клавишу <Enter> можно нажать в любой момент. После этого текущая строка
будет выполнена как команда.
$ mary had а li ttle lamЬda Нажа ть кла вишу <En ter>;
в в е с ти кома нду
k s h : ma r y : not found
$
По мере ввода текста строка, ограниченная знаками ' и ' , обновляется вводи
мым текстом, а остальная часть строки обновляется совпадающей командой :
( reverse-i- search ) ' ' : с ( reverse-i-search ) ' с ' : e�ho this is а
test
( reverse-i-search ) ' с ' : e�ho this is а test d ( reverse-i -search ) ' �d ' : cd /tmp
Команда hi s tory
Чтобы получить доступ к предыстории команд, проще всего ввести команду
hi s tory:
$ history
507 c d she l l
508 c d ch 1 5
509 vi int
510 ps
511 e cho $ Н I S T S I Z E
512 c a t $ ENV
513 ер i n t i n t . s v
514 hi story
515 exit
516 cd s h e l l
517 cd c h l б
518 vi all
519 run - n 5 a l l
52 0 ps
52 1 l p r a l l . ou t
522 h i s tory
стори ю команд, даже если она состоит из 500 или 1 000 строк.
Другие способы доступа к п редыстори и команд 353
Кома нда fc
Эта команда позволяет запустить редактор по одной команде или больше из
предыстории или направляет сп исок команд из предыстории на терми нал. Она
действует аналогично команде h i s t or y, но только в более удобной форме, где с
помощью параметра - 1 можно указать количество выводимых из предыстории
команд. Например, команда
fc -1 5 1 0 5 1 5
что вы только что выполнили длинную команду и решили, что было бы неплохо
преобразовать введен ную командную строку в программу оболочки под назва
нием runx. Используя команду fc, вы можете получить команду из своей пре
дыстории и переадресовать ввод-вывод, чтобы записать данную команду в файл,
как показано ниже.
f c - n -1 -1 > runx
Кома нда r
Эта простая команда оболочки Korn позволяет повторно выполнять предыду
щие команды нажатием нескольких клавиш. Достаточно ввести команду r, чтобы
оболочка Korn повторно выполнила последнюю команду, как демонстрируется в
следующем примере:
354 Гл а в а 1 4 . И нтеракт и в н ы е и неста нда ртн ые с редства оболочки
$ date
Thu O c t 2 4 1 4 : 2 4 : 4 8 E S T 2 0 0 2
$ r Повторно выполнить предыдущую кома нду
da t e
Thu Oct 24 1 4 : 2 5 : 1 3 EST 2 0 0 2
$
'
$ pwd
/ u s e r s / s t e ve
$ r cat Воз вра тить по следнюю кома нду ca t
c a t doc s / p l anA
$
$
а еще проще:
$ r cat А=В
c a t doc s /p l anB
$ !d
da t e
Thu Oct 24 1 4 : 3 9 : 4 0 EST 2 0 0 2
$
Фун к ц и и 355
$ fc -s В=С
c a t do c s /p l a nC
Ф у н к ци и
В оболочках Bash и Korn поддерживаются функции, н е доступные в оболочке,
совместимой со стандартом POSIX. Рассмотрим их более подробно в последую
щих разделах.
Л о ка л ьн ы е п е р емен н ы е
В оболочках Bash и Korn функции могут иметь локальные переменные, бла
годаря которым функции могут быть сделаны рекурсивными. Эти п еременные
определяются с помощью команды type s e t, как демонстрируется ниже. Если
перемен ная с таким же самым именем уже существует, она сохраняется при вы
полнении команды type s e t и восстанавливается при выходе из функции.
t yp e s e t i j
Ц ел оч и сл е н н ы е а р и ф м е ти ч ес к и е о п е ра ци и
В оболочках Bash и Korn поддерживается вычисление арифметических выра
жений без специального развертывания арифметического аппарата. С этой це
лью используется синтаксис, аналогичный конструкции $ ( ( . . . ) ) , только без
356 Гп <� ы � 1 4 . И нтера кти вные и неста нда ртн ые средства оболочки
fi
fi
начальные значения могут быть присвоены переменным в тот момент, когда они
объявляются:
t ype s e t - i s i gn a l = l
В оболочке Bash применяется как синтаксис о снова ние# число для указания
произвольных оснований систем счисления, так и синтаксис языка С для пред
ставления восьмеричных и шестнадцатеричных чисел. При этом восьмеричные
числа предваряются префиксом О (нуль), а шестнадцатеричные - префиксом Ох,
как демонстрируется в следующем примере:
$ typeset - i i=O l O O
$ echo $i
64
$ i=Ox80
$ echo $i
128
$ i=2 # 1 1 0 1 0 0 1
$ echo $i
105
$ ( ( i = 1 6#а5 + 1 6#120 ) )
$ echo $i
453
$
К о м а нда alias
Псевдоним служит кратким обозначением, предоставляемым оболочкой с це
лью разрешить специализацию команд. В оболочке поддерживается список псев
донимов, которые обнаруживаются при вводе команд прежде любых других под
становок. Если первым словом в команде оказывается псевдоним, оно заменяется
текстом данного псевдонима.
Псевдоним определяется с помощью команды a l i a s , общая форма которой
выглядит так:
alias имя= стр ока
Такой прием кажется вполне обоснован ным, но давайте посмотрим, каким об
разом этот псевдоним действует на практике:
$ alias dir="echo $ { PWD# # * / } " Определить псевдоним
$ pwd Выяснить ме стоположение
/ u s e r s / s teve
$ dir Выполнит ь псевдоним
s t e ve
$ cd letters Сменить ка талог
$ dir Выполнить псевдоним снова
s t eve
$ cd /usr/ spool Сдела ть еще одну попытку
$ dir
s t eve
$
Это означает, что псевдоним di r был, по существу, определен так, как будто
бы мы ввели его следующим образом:
$ a l i a s dir= " e cho s t eve "
В <;Р орме
alias имя
l o c a l = t ype s e t
nohup= ' nohup '
r= ' fc - е - '
s u s pe nd= ' k i l l - STO P $ $ '
Уда л ен ие п с е в дон и м о в
Команда una l i a s служит для удаления псевдонимов из списка. Так, следую
щая форма команды una l i a s :
una l i a s имя
М а сс и в ы
В оболочках Korn и Bash предоставляются ограниченные возможности мани
пулирования массивами. Массивы в оболочке Bash могут содержать неограни
ченное количество элементов, которое фактически ограничивается доступным
объемом оперативной памяти. А в оболочке Korn размеры массивов ограничи
ваются 4096 элементами. Индексация массивов в обеих оболоч ках начинается с
нуля.
Элемент доступен в массиве по индексу, которым может быть целочисленное
выражение, заключаемое в квадратные скобки. Вместо того чтобы объявлять
максимальный размер массива в оболочке, можно просто присвоить значения его
элементам по мере надобности. Присваиваемые значения ничем не отличаются
от обычных значений переменных, как демонстрируется в следующем примере:
$ arr [ O J =hello
$ arr [ l ] =" some text"
$ arr [ 2 ] =/users/ s teve/memos
$
М асси вы 363
$ array [ l O ] =foo
$ echo $ { array [ * ] } Отобра зить в се элеме нты
he l l o s ome t e x t / u s e r s / s t e ve /memo s foo
$ echo $ { #array [ * ] } Коли ч ество элементов в ма с сив е
4
$
$ typeset - i array
$ array [ O ] =lOO
$ array [ l ] =SO
$ ( ( array [ 2 ] = array [ O ] + array [ l ] ))
$ echo $ { array [ 2 ] }
150
$ i=l
$ echo $ { array [ i ] }
50
$ array [ З ] =array [ O ] +array [ 2 ]
$ echo $ { array [ 3 ] }
250
$
t ype s e t - i l i ne=O
wh i l e ( ( l ine > О ) ) do
( ( l i ne = l i n e - 1 ) )
echo " $ { bu f [ l ine ] } "
done
$ reverse
line one
line two
line three
<Ct r l + d>
l i ne three
l i ne two
l i ne one
$
В еще одном, приведен ном ниже примере определяется функция cdh ( ) , не
только изменяющая текущий каталог, но и применяющая массив для ведения пре
дыстории предыдущих каталогов. Это дает пользователю возможность вывести
из предыстории список каталогов и перейти в любой каталог из этого списка.
$ cat cdh
C DН I ST [ 0 ] = $ PWD # инициализировать элемент ма ссива C DH I ST [ O ]
cdh ( )
{
type s e t - i cdlen i
i f [ $ # -eq О ] ; then # е сли аргументы отсутст вуют , то
# по умолчанию установить началь ный
# каталог в переме нной НОМЕ
s e t - - $НОМЕ
fi
$ cdh -1
$ pwd
/ tmp
$ cdh - 3
$ pwd
/ u s r / spoo l / uucppuЫ i c
$
cdh ( )
{
t ype s e t - i cdlen i
i f [ $ # - eq О ] ; then # е сли аргументы отсутств уют , то
# по умолчанию установить началь ный
# каталог в переменной НОМЕ
s e t - - $НОМЕ
fi
C DH I ST [ cdlen ] = $ PWD
}
$
$ cd -1
О / u s e r s /pat
1 / trnp
$ cd /usr/ spool
$ cd -1
о / u s e r s /pat
1 / trnp
2 / u s r / spool
$
Конструкци я Н азна ч ен ие
$ { array[ i ] } Подставить значение i - го элемента указанного массива
$ array Подставить значение первого элемента указанного массива
( array [ O ] )
$ { array[ * ] } Подставить значения всех элементов указанного массива
$ { # array[ * ] } Подставить количество элементов указанного массива
array [ i ] =зна чение Сохранить заданное эна чение в элементе array[ i ] указанно-
го массива
Уп ра в ле н и е з ада н и я м и
В оболочке предоставляются средства для непосредствен ного управления за
даниями из командной строки. Задание это любая команда или последователь
-
Когда команда запускается в фоновом режиме (т.е. по ссылке &), оболочка вы
водит номер задания в квадратных скобках ( [ ] ) , а также идентификатора про
цесса, как показано ниже.
$ who 1 wc &
[ 1 ] 832
$
$ stty tostop
$ rundЬ За пустить программу ба зы да нных
? ? ? find green red На йти з еленые и кра сные о бъекты
<Ct r l + z > Выполнение зада ния може т о тнять время
[ 1 ] + S t opped rundb
$ bg Поэтому перене сти зада ние в фоновый режим
[1] rundb &
Выполнить ка кое -нибудь друго е зада ние
$ j obs
[ 1 ] + S t opped ( t t y output ) rundЬ &
$ fg Перенести зада ние обра тно в приоритетный режим
rundЬ
1 97 3 Fo rd Mus t ang red
1 975 Chevy Mon te C a r l o green
1976 Ford Granada green
1980 Bu i c k Century green
1983 Chevy Cava l i e r red
? ? ? find Ыuе На йти синие о бъ екты
<Ct r l + z > Прио с та новить зада ние снова
[ 1 ] + S t opped rundb
$ bg Перене сти зада ние о бра тно в фоновый режим
[1] rundb &
Продолжить ра бо ту до за в ершения
Ра з н ы е с р е д ств а
И в завершение этой главы будет рассмотрен ряд других полезных средств, до
ступных в обеих рассматриваемых оболочках.
З а м ен а з на ка тил ь д ы
Если слово в командной строке начинается со знака тильды (-), оболочка вы
полнит следующее: если знак тильды является еди нствен ным символом в слове
или же если после знака тильды следует знак /, то в данном месте командной
строки подставляется значение переменной НОМЕ. В следующем примере показа
но, каким образом замена знака тильды осуществляется на практике:
$ echo �
/users /pat
$ qrep Korn �/shell/chapter9/ksh
The Korn s he l l is а new s he l l deve l o p e d
Ь у D a v i d Ko r n a t АТ & Т
f o r t h e Bourne s he l l wou l d a l s o run unde r t h e Ko r n
t h e опе оп S y s t em V , t h e K o r n s h e l l p r o v ide s y o u w i t h
i de a o f the c ompa t i b i l i t y o f t h e Ko r n s h e l l w i t h Bourne ' s ,
the Bourne and Ko rn s he l l s .
The ma i n f e a t u r e s added t o t h e Korn s he l l a re :
$
Если остальная часть слова вплоть до знака косой черты представляет собой
регистрационное имя пользователя в файле / e t c /p a s swd, знак тильды в реги
страционном имени пользователя заменяется его начальным каталогом из пере
менной НОМЕ, как демонстрируется в следующем примере кода:
$ echo �s teve
/ u s e r s / s t e ve
$ echo �pat
/users /pat
$ qrep Кorn -pat/shell/chapter9/ksh
The Korn s he l l is а new s he l l deve loped
Ь у Da v i d Ko rn a t АТ & Т
Разн ые средства 373
Если после знака тильды в командной строке оболочек Korn и Bash следует
знак + или -, то вместо него подставляется значение переменной PWD или OL D PWD
соответственно, как в приведенном н иже примере. Переменные PWD и OL D PWD
устанавливаются по команде cd и содержат полные пути к текущему и предыду
щему каталогам соответственно. Но в оболочке по стандарту POSIX сочетания
символов -+ и - - не поддерживаются.
$ pwd
/ u s r / spoo l / uucppuЫ i c / s teve
$ cd
$ pwd
/ u s e r s /pat
$ echo + -
/ u s e r s /pat
$ echo --
/ u s r / spoo l / uu cppuЫ i c / s teve
$
РАТН.
П оря д ок п оиска
Вводя имя команды, следует иметь в виду следующий порядок поиска, приме
няемый оболочкой при анализе содержимого командной строки.
1. Сначала оболочка проверяет, является ли введенная команда зарезервиро
ванным словом (напри мер, f o r или do) .
2. Если это не зарезервированное слово и не заключенное в кавычки, обо
лочка далее проверяет список своих псевдонимов. И если она обнаружит
совпадение, то выполнит подстановку. А если определение псевдонима
оканчивается пробелом, то оболочка и в этом случае попытается подста
вить псевдон им в следующем слове. Окончательный результат затем про
веряется по списку зарезервированных слов, и если проверяемое слово не
зарезервировано, то оболоч ка перейдет к следующему этапу.
3. Оболоч ка проверяет команду по списку ее функций и выполняет однои
менную фун кцию, если она обнаружена.
374 Гп а в а 1 4 И нтера кти вн ые и н еста нда ртн ые средства оболочки
только в том случае, если она вызывается по имени sh, с параметром командной
строки pos i x или после выполнения команды s e t - о po s i x.
- -
Массивы х х
Управление заданиями UP х х
Команда cd - х х х
Команда сd прежний ноlЗЫЙ х
Комбинаци и --иня_польэоsа 'l!еля, /
-. х х х
Комбинации -. + , -. - х х
Кр атко е изложен ие оболочки
За пус к
При запуске оболочки в командной строке могут быть заданы такие же пара
метры, как при вводе команды s e t. Кроме того, могут быть указаны следующие
параметры.
К о ма нд ы
Общая форма для ввода команд выглядит следующим образом:
к ома нды ар гуме нты
где команды - имя выполняемой программы или команды, тогда как аргумен
ты -ее конкретные аргументы. Имя программы или команды и ее аргументы
разделяются пробельными символами (как правило, пробелами, знаками табуля
ции и новой строки), но это положение можно измен ить, внеся соответствующие
коррективы в переменную I FS.
В одной строке можно ввести несколько команд, разделив их точкой с запятой
( ; ). Каждая выполняемая команда возвращает число, называемое кодом заверше
ния, где нулевое значение обозначает удачный исход, а ненулевое - неудачный
исход выполнения команды.
Знак 1 может служить для связывания стандартного вывода из одной команды
со стандартным вводом другой, как демонстрируется в следующем примере:
who 1 wc -1
В этом случае код завершения обозначает исход выпол нения последней коман
ды в конвейере. Если указать знак ! в начале конвейера, код завершения будет
обозначать состояние, противоположное исходу выполнения последней команды
в конвейере.
378 П р 1ню ж е н и е д _ Краткое изложен ие оболочки
команда e cho будет выполнена лишь в том случае, если команда grep возвратит
нулевой код завершения.
К о м м е нта р и и
Если в строке обнаруживается знак # , оболочка воспринимает остальную
часть строки как комментарий, и гнорируя ее в целях интерпретации, подстанов
ки и выполнения.
П ере м е н н ы е о б ол о ч ки
Имя переменной оболоч ки должно начинаться с буквенного символа или
знака подчеркивания (_), а за ним может следовать л юбое количество буквенно
цифровых символов или знаков подчеркивания. Переменным оболоч ки можно
присваивать значения в приведенной ниже форме, где указан ное зна чение не
заменяется на имя файла.
переменна я= з на чение переменна я= зна чение
П о з и ци о н н ы е п а ра м ет р ы
Всякий раз, когда выполняется программа оболочки, ее имя присваивается
переменной $ О , а ее аргументы, введенные в командной строке, - переменным
$ 1 , $2 и т.д., обозначающим соответствующие позиционные параметры. Значе
ния могут быть присвоены позиционным параметрам и с помощью команды s e t .
Ссылаться на позиционные параметры 1 -9 можно непосредственно, как показано
выше, а на позиционные параметры, следующие после 9-го, - в фи гурных скоб
ках, как, например: $ { 1 О } .
С п е ц иал ь н ы е п а ра м етры
В табл. А. 1 перечислены специальные параметры оболочки, обозначаемые со
ответствующими переменными.
П ози ц ион н ые п а ра метры 379
Переменная Назначение
CDPATH Каталоги для поиска при выполнении команды cd без указания полного
пути в качестве аргумента
ENV Имя файла, выполняемого оболочкой в текущей среде, при условии запу
ска в интерактивном режиме
FCED I T Редактор, применяемый в команде f c . Если о н не задан, применяется ре
дактор ed
H I STFILE Если эта переменная установлена, она обозначает файл, применяемый
для хранения предыстории команд. А если эта переменн ая не установлена
или же если файл не доступен для записи, то применяется файл $НОМЕ / .
sh_history
H I STS I ZE Если эта переменная установлена, она обозначает количество введенн ых
ранее команд, доступ ных для редактирования. По умолчанию это количе
ство оказывается не меньше 1 2 8
НОМЕ Начальный каталог пользователя, в который происходит переход при вы
полнении команды cd без аргументов
I FS Внутренний разделитель полей, употребляемый в оболоч ке для разде
ления слов при синтаксическом анализе командной строки для команд
read и set; при подстановке результатов, выводимых из команды, за
ключаемой в кавычки; а также при подстановке параметров. Как правило,
эта переменная содержит три символа: пробела, горизонтальной табуля
ции и новой строки
380 П р и 11 ож е н и е А . Краткое изложен ие оболочки
Конструкц ия Назначение
$паране!l'р или $ { параме!I'р} Подставить значение указанного параме!l'ра
$ { параме!l'р : - зна чение} Подставить значение указанного параме!l'ра, если зада
но непустое его значение, а иначе - заданное значение
$ { параме!l'р-зна чение } Подставить значение указанного параме!l'ра, если зада-
но его значение, а иначе - заданное значение
$ { параме!I'р : =зна чение } Подставить значение указанного параме!l'ра, если зада
но непустое его значение, а иначе - подставить задан
ное значение и присвоить его указанному параме!l'ру
$ { параме!I'р=зна чение } Подставить значение указанного паране!l'ра, если это
значение установлено, а иначе - подставить заданное
зна чение и присвоить его указан ному параме!l'ру
$ { параме!I'р : ? зна чение } Подставить значение указанного параме!l'ра, если это
значение установлено и не является пустым, а иначе -
направить заданное зна чение в стандартный вывод
ошибок и на этом завершить операцию. Если же зна
чение пропущено, вывести сообщение об ошибке
"parame ter : parameter nul l or not set " (пара
метр: пустой или не установленный)
$ { паране!I'р : +зна чение} Подставить заданное значение, если в указанном па
раме!l'ре установлено непустое значение, а иначе -
подставить пустое значен ие
$ { параме!l'р+зна чение } Подставить заданное зна чение, если оно установлено в
указанном паране!l'ре, а иначе - пустое значение
$ { #паране!I'р } Подставить длину указанного параме!l'ра. Если в каче
стве параме!l'ра указан знак * или @, результат данной
операции не определен
$ { паране!l'р#шаблон } Подставить значен ие указанного параме!l'ра, удалив
слева наименьшую его часть, совпадающую с заданным
шаблоном, где могут использоваться символы подста
новки имен файлов ( * , ? , [. ] , ! и @)
. .
П о вто рн ы й в в о д к о м а н д
В оболочке ведется список предыстории недавно введенных команд. Коли
чество команд, доступных в предыстории, определяется значением переменной
H I S T S I Z E (по умолчанию оно, как правило, равно 1 2 8), а файл, в котором хра
нится предыстория, - значением переменной H I S T FI LE (по умолчанию она со
держит путь к файлу $ НОМЕ / . s h h i s t o ry). А поскольку предыстория команд
_
Ком а нда fc
Встроенная в оболочку команда f c позволяет запустить редактор для правки
одной или нескольких команд из предыстории. Как только отредактированная
команда будет записана и завершится работа в редакторе, поправлен ная версия
команды будет благополучно выполнена. Конкретный редактор определяется
значением переменной FCE D I T (по умолчани ю ed). Для обозначения конкрет
-
Окончание табл. А . 4
Ко манда Назна ч ен ие
у Скопировать символы от текущего до конца строки; то же,
что и команда у$
R Перейти в режим ввода и перезаписать символы в строке
[ подсчет] r c Заменим текущий символ указанным символом с
[ подсчет] х Удалить текущий символ
[ подсчет] Х Удалить предыдущи й символ
[ подсчет] . Повторить предыдущую команду изменения текста
Сменить на противоположный регистр букв текущего сим
вола и переместить курсор вперед
[ подсчет] Присоединить слово под указанным номером подсчет из
предыдущей команды и перейти в режим ввода; по умолча
нию это последнее слово
=
Вывести список файлов, нач инающийся с текущего слова
\ Дополнить путь текущим словом; если текущее слово явля
ется каталогом, добавить знак / ; а если текущее слово явля
ется файлом, то добавить пробел
и Отменить последнюю команду изменения текста
u Восстановить первоначальное состояние текущей строки
@ буква Программируемая функциональная клавиша. Если опреде
лен псевдоним имени _буква, будет выполнена команда,
определяемая его значением
[ подсчет] v Запустить редактор vi для правки строки под указанным
номером подсчет; если же подсчет опущен, используется
текущая строка
<Ctrl+l> Перевести строку и вывести текущую строку
L Вывести текущую строку снова
<Ctrl+j > Выполнить текущую строку
<Ctrl+m> Выполнить текущую строку
<Enter> Выполнить текущую строку
# Вставить знак # в начале строки и ввести строку в предысто
рию команд; то же, что и последовательность I # <Enter>
З а кл ю ч ен и е в ка в ы ч к и
В оболо ч ке приняты четыре механизма заключения в кавыч ки (табл. А . 5) .
Табл и ца А. 5 . Сводка меха н из мов з аключе н и я в кавычки
Меха н и зм Оп иса н ие
Отменяет специальное назначение все х символов, заклю
ченных в кавыч ки
386 П р и n о же н и е А . Краткое изложен ие оболочки
Окончание табл. А .5
Меха н и з м Оп исан ие
" " О т меняе т специал ь ное назначение всех символов, заклю
ченных в кавычки, к р оме знаков $ , ' и \
\с О т меняе т специал ь ное назначение указ а нного "имвола
с; в двойных кавычках от меняе т ся н азначение указанных
знаков $ , ' , " , \ и новой с тр оки, кот о рые ин аче не ин
те рп р е т и рую тся; п р именяе т ся для п р одолжения с тр оки,
если оказывае т ся последним символом в с т роке (зн ак но
вой с троки удаляе т ся )
' команда ' и л и $ ( команда ) Выполняе т у казанн ую команду и вс т а вляе т в д а нном ме
с т е с т андарт ный вывод
З а ме н а з н а ка тил ьд ы
Каждое слово и переменная оболочки в командной строке проверяется на на
личие в ее начале знака тильды ( -) без кавычек. Если есть этот знак, остальная
часть слова или значения переменной вплоть до знака / считается регистраци
онным именем пользователя, которое и щется в системном файле (как правило,
в файле / e t c /pa s swd) . И если такой пользователь существует, то его начальный
каталог заменяет знак - и регистрационное имя пользователя. А если пользова
тель отсутствует, то текст не изменяется. Сам же знак ... или следующий за ним
знак / заменяется значен ием переменной НОМЕ.
Унар ны й м ин ус
По р аз рядное НЕ
Логическое о тр ицание
*, /, % Ум ножение, деление, пол учение ос т ат ка от
деления
+, - Сложение, вычи т а ние
<< , >> С двиг влево, сдви г вп р а во
П одста нов ка и мен фа йлов 387
П одста н о в ка и м е н ф а й л о в
После подстановки параметров и команд в командной строке оболочка про
изводит поиск специальных символов * , ? и [ . Если они не заключены в кавыч
ки, оболочка производит поиск текущего или другого каталога при условии, что
он предваряется знаком / , а затем подставляет и мена всех совпадающих файлов.
А если ни одного совпадения не найдено, то специальные символы остаются без
изменения.
Следует, однако, и меть в виду, что имена файлов, начинающиеся с точки ( . ),
должны совпадать непосредственно. Иными словами, скрытые файлы отобразят
ся не по команде e cho *, а по команде e cho * . Все символы подстановки имен
.
Си м вол ( ы ) Назначение
? С овпадение с любым одиночным символом
* С овпаден и е с нулевым или б ольшим количеством символов
388 П р и л ож е н и е А . Краткое изложен ие оболочки
Окончание табл . А . 6
Си м вол ( ы ) Назначение
[ СИНВОJПJ] С овпадение с любым одиночным символом, присутствующим среди ука
занных синволоз; для совпадения с любым символом в пределах от С1
до С2 включительно можно воспользоваться формой С1 - С2• Напl"имер с
шаблоном [ A- Z ] совпадает любая прописная буква
[ ! СИНВОJПJ] С овпадение с любым одиночным символом, отсутствующим среди ука
занных синволов; диапазон сопоставляемых с шаблоном символов мо
жет быть указан, как описано выше
Конструкция Назначение
< файл Переадресовать стандартный ввод из указанного файла
> файл П ереадресовать стандартный вывод в указанный файл; если этот файл
не существует, он создается, а есл и он существует, то обнуляется
> 1 файл Переадресовать стандартный вывод в указанный файл, если этот файл
не существует, он создается, а если он существует, то обнуляется; при
этом параметр noclobber ( -С ) команды set и гнорируется
>> файл То же, что и >. только результат вывода присоединяется к указанному
файлу, если он существует
<< слово Переадресация стандартного ввода из последующих с т рок до тех пор,
пока не вс т ретится строка, содержащая указанное слово. В с т роках вы
полняется подстановка параметров, выполняются команды, заключенные
в кавычки, а также интерпретируется знак обратной косой черты. Если
любой символ в указанном слове заключен в кавычки, то ни одна из
перечисленных выше операций не выполняется; а если указанное слово
предваряется знаком -, то из строк удаляются начальные знаки табуляции
< & цифра П ереадресация стандартного ввода из файла, связанного с указанным де
скриптором цифра
> & цифра П ереадресация стандартного вывода в файл, связанный с указанным де
скриптором цифра
<& Закрытие стандартного ввода
>& Закрытие стандартного вывода
<> файл О ткрытие указанного файла как для чтен ия, так и для записи
Э кспорти руем ы е перемен ные и выпол нен ие подоболочек 389
Э к сп орти руе м ы е п е р е м е н н ы е
и в ы п ол н е н и е п одо б ол о ч е к
Все команды, кроме встроенных в оболоч ку, как правило, выполняются в но
вом экзем пляре оболоч ки, называемом подоболочкой . В подоболоч ках нельзя из
менять значения переменных из родительской оболочки, и в них доступны толь
ко те переменные, которые (явно или неявно) экспорт ированы из родительской
оболоч ки. Если в подоболоч ке изменяется значение одной из этих переменных
и требуется известить об этом ее собственные подоболоч ки, такая переменная
должна быть экспортирована перед выполнением подоболочки. А по завершении
подоболочки любые установленные в ней переменные становятся недоступными
для родительской оболоч ки.
. . .)
Ко н стр у к ц ия (
Если заключ ить одну или несколько команд в круглые скобки, эти команды
будут выполнены в подоболочке.
Ко н стр у к ц ия { . . . ; }
Если заключ ить одну или несколько команд в фигурные скобки, эти коман-
ды будут выполнены в текущей оболочке. С помощью конструкций { . . . ; } и
( . . . ) можно переадресовать и направить ввод-вывод по каналу в ряд команд,
заключен ных в скобки, а также отправить их на выполнение в фоновый режим,
указав в конце знак &. Напри мер, в следующей строке:
( p ro g l ; p r o g 2 ; p r o g З ) 2 >e r r o r s &
Ф у н кци и
Функции принимают следующую форму:
имя ( ) составная_ кома нда
где со ста вна я_ кома нда - это ряд команд, заключенных в скобки ( . . . ) ,
{ . . . } или блок операторов for, c a s e , unt i l, whi l e. Чаще всего функции
определяются в следующей форме:
имя () { команда ; кома нда ; кома нда ; }
где имя - это имя функции, определяемой в текущей оболочке, поскольку функ
ции нельзя экспортировать. Определение функции можно распространить на
столько строк, сколько потребуется. С помощью команды re turn можно пре
рвать выполнение функции, не прерывая выполнение самой оболочки (подроб
нее об этом - в описании команды return). Так, в следующем примере:
nf ( ) { ls 1 wc -1 ; }
Уп ра влен и е з ада н и я м и
В последующих разделах вкратце поясняется, каким образом организуется
управление заданиями.
З ада н ия в о б о л о ч ке
Каждой последовательности команд, выпол няемых в фоновом режиме, при
сваивается номер задания, начиная с первого. На задание можно ссылаться по
его идентификатору ( j оЬ i d) , который состоит из знака % и номера задания,
_
Останов к а зада н и й
Если оболочка выполняется в системе с управлением заданиями и при этом
активизирован параметр mon i t o r команды s e t , задания, выполняемые в
приоритетном режиме, могут быть перенесены в фоновый режим, и наоборот.
Как правило, текущее задание останавл ивается нажатием комби нации клавиш
<Ctrl + z > . По команде bg остановленное задан и е переносится в фоновый ре
жим, а по команде fg - фоновое или остановленное задание в приоритетн ый
режим
Всякий раз, когда в фоновом задан ии предпринимается попытка прочитать
данные с терминала, оно приостанавливается до тех пор, пока не будет перене
сено в приоритетный режим. Результаты, выводимые из фоновых заданий, как
правило, направляются на терминал. Если выполняется команда s t ty tos top,
вывод из фоновых заданий запрещается, а задание, выводящее результаты на тер
минал, приостанавливается до тех пор, пока не будет перенесено в приоритетный
режим. При выходе из оболочки все остановленные задания уничтожаются.
Сводка ко м а нд
В этом разделе вкратце поясняются команды, встроенные в стандартную обо
лочку. В действительности некоторые из этих команд ( например, e cho и t e s t )
могут н е быть встроены в оболочку и л и иметь упрощен ную версию для встраи
ваниЯ' в оболочку, а более сложную версию - в виде отдельной программы. Но
в любом случае подобные функции должны быть предоставлены в виде утилиты
в системе, совместимой со стандартом POSIX. Они встроены в оболочки Bash и
Korn и при меняются практически во всех сценариях оболочки.
Команда :
Общая форма:
По существу, это пустая команда. Она нередко применяется с целью удовлет
ворить требованию наличия команды.
392 П р и л ож е н и е А. Краткое изложение обол оч ки
Пример:
if who 1 grep j ac k > / d e v / nu l l t h en
e l se
echo " j a c k ' s n o t l o g g e d i n "
fi
Ком анда .
Общая форма: . фа йл
Команда-точка ( ) вынуждает оболочку прочитать и выполнить указанный
.
файл, как будто строки из этого файла были введены в данный момент. Однако
указанный фа йл совсем не обязательно должен быть исполняемым, а только до
ступным для чтения. Для поиска указанного файла оболоч ка обращается также
к переменной РАТН.
Пример
p r o gde f s Выполнить кома нды из файла progdexs
Кома нда Ьg
Общая форма: bg j оЬ_ i d
Если активизировано управление заданиями, т о задание, обозначаемое иден
тификатором j оЬ i d, переносится в фоновый режим . Если же команда bg вве
дена без аргументов, то в фоновый режим переносится самое последнее приоста
новлен ное задан ие.
Пример:
bg '1. 2
кома нда ; ;
ша блон) кома нда
кома нда
команда ; ;
ша блонп ) команда
команда
кома нда ; ;
e sac
Ком а нда cd
Общая форма: cd ка талог
Выполнение этой команды приводит к тому, что оболочка делает указанный
ка талог текущим. Если же ка талог опущен, оболочка сделает текущим каталог,
указанный в перемен ной НОМЕ.
Если значение переменной оболочки C D PATH окажется пустым, в качестве
ка талога следует указать полный путь к каталогу ( например, / u s e r s / s t eve /
document s ) или путь относительно текущего каталога (напри мер, docume n t s
или . . /pat). Если же значение переменной оболоч ки C D PATH окажется непу
стым, а в качестве ка талога указан полный путь, оболочка произведет поиск
каталога, содержащего заданный ка талог, в списке разделяемых двоеточием ка
талогов, находящемся в переменной C D PATH.
Примерь�:
$ cd docume n t s /memo s Перейти в ка талог documen ts/mвmos
$ cd Перейти в на чальный ка талог
Сводка команд 395
/ u s r / l i Ь / uucp
$
Команда echo
Общая форма: echo аргументы
Выполнение этой команды приводит к тому, что указанные аргументы на
правляются в стандартный вывод. Каждое слово, которое содержат указанные
аргументы, разделяется пробелом. Знак новой строки выводится последним.
Если же аргументы опущены, то происходит обычный пропуск строки. Неко
торые символы, экранированные знаками обратной косой черты, и меют специ
альное назначение в команде e cho (табл. А.8).
Табл и ца А.8. Уп равл я ющие с и м волы, при меняемые в команде echo
'
Си мвол Назначение
\а Предупрежде н ие
\Ь Возвр ат на од н у позици ю
\с Строк а без з а верш а ющего знака н овой стро к и
\f Перевод стр ан ицы
\n Нов ая строк а
\r Перевод к а ретки
\t Горизон т а ль ная т абуляция
396 П р и л оже н и е А . Краткое изложен ие оболочки
S a l e s Rep o r t
$ echo "Wake up ! ! \a " Выв ести сообщение и
предупреждающий сигнал на терминал
Wa k e up ! !
$
Примеры:
who 1 grep $ u s e r > / d e v / nu l l
exit Выйти с кодом з а в ершения по следней кома нды grep
exit 1 Выйти с кодом за в ершения 1
i f f i ndu s e r Если кома нда xinduser в озвраща ет нулевой
код за в ершения , то . . .
then
fi
Однако следует иметь в виду, что выполнение команды exi t в исходной обо
лочке приведет к выходу из системы.
Примеры:
expo r t РАТ Н P S l
expo r t dbhorne x l y l d a t e
Команда fal se
Общая форма: f a l s e
Команда f a l s e возвращает ненулевой код завершения.
Ко м а нда fc
Общая форма: fc - е реда ктор - l nr перв ая последняя
f c - s прежняя=нова я перв ая
Кома нда fg
Общая форма: fg j ob_ i d
Если активизировано управление заданиями, т о задание с указанным иден
тификатором j оЬ_ i d переносится в приоритетный режим. Если же аргументы в
данной команде отсутствуют, то задание, приостановленное или отправленное в
фоновый режим самым последним, переносится в приоритетный режим.
Пример:
fg \\ 2
Ко манда for
Общая форма:
for переменна я in слов о , слов о2 • • • слово"
do
кома нда
команда
done
400 П р иложен и е А. К раткое изложен ие оболоч ки
done
done
Пример:
# Обработа т ь все файлы в т е кущем каталоге п о команде nroff
f o r f i l e in *
do
n ro f f - T l p $ f i l e 1 lp
done
Ко ма нда getopts
Общая форма: g e t o p t s параметры переменна я
Эта команда обрабатывает аргументы командной строки. Здесь параме т
ры это список достоверных однобуквенных параметров. Если после любой
-
do
c a s e " $ opt "
in
r) r flag=l ; ;
О ) o f l ag = l
o f i l e = $ 0PTARG ; ;
\ ? ) e ch o " $ u s a g e "
402 П р и л оже н и е А. Краткое изложен ие оболочки
exit 1 ; ;
esac
done
i f ( $ 0PT I N D -gt $# ]
then
e ch o "Needs i np u t f i l e ! "
e c h o " $ u s a ge "
exit 2
fi
s h i f t $ ( ( OPT I N D - 1) )
i fi le=$ 1
Ко ма нда hash
Общая форма: ha s h кома нды
Эта команда предписывает оболочке найти указанные кома нды и запомнить
каталоги, в которых они н аходятся. Если кома нды не указаны, то выводится спи
сок хешированных команд. Если же данная команда используется в следующей
ф орме:
hash -r
Кома нда i f
Общая форма:
i f кома нда ,
then
команда
команда
fi
Прим ер:
i f g rep $ s ys s y s name s > / d e v / n u l l
then
echo " $ s y s is а va l i d s ys t em n ame "
fi
else
кома нда
кома Нда
fi
Если указанная кома нда1 возвращает нулевой код завершения, то выполня
ются команды, находящиеся между операторами then и e l s e , а команды, следу
ющие после оператора e l s e, пропускаются. Если же указан ная команда1 возвра
щает flенулевой код завершения, то команды, н аходящиеся между операторами
then и e l s e , пропускаются, а выполняются команды, находящиеся между опе
раторами e l s e и f i .
Прим ер:
if [ -z " $ l i ne "
then
echo "I cou l dn ' t f i n d $ n ame "
else
echo " $ l i ne "
fi
404 П р и n о ж е н и е А. Краткое изложен ие оболочки
e l s e i f кома нда 2
then
команда
кома нда
else
команда
команда
fi
ся по порядку до тех пор, пока одна из этих команд не возвратит нулевой код
завершения. И в этот момент выполняются команды, следующие сразу же после
оператора then и вплоть до очередного оператора e l i f, e l s e или f i . Если же
ни одна из указанных команд не возвратит нулевой код завершения, то выполня
ются команды, следующие сразу же после оператора e l s e , при условии, что они
заданы.
Пример:
if [ " $ ch o i ce " = а then
a dd $ *
e l i f [ " $ ch o i ce " d t he n
de l e t e $ *
e l i f [ " $ ch o i ce " 1 then
list
else
e ch o " Bad cho i c e ! "
e r r o r =TRUE
fi
Сводка ко м а нд 405
Кома нда k i l l
Общая форма: k i l l - сигнал з ада ние
Команда ki 1 1 посылает сигнал указанному процессу на его прерывание,
где з ада ние идентификатор процесса или идентификатор задания j оЬ_ i d,
-
ловочном файле < s i g na l . h> (подробнее об этом см. далее оп исание команды
t rap). Имена сигналов перечисляются по команде k i l l - 1 . Если вместе с пара
метром -1 указан номер сигнала, то выводится соответствующее имя сигнала.
А если вместе с параметром - 1 указан идентификатор процесса, то выводится
наименование си гнала, прервавшего данный процесс, если он действительно был
прерван этим сигналом.
Вместе с наименованием сигнала может быть также указан параметр - s . В этом
случае наименование си гнала не предваряется знаком дефиса, как демонстриру
ется в одном из при веденных ниже примеров. Если же конкретны й сигнал не
указан, то используется наименование сигнала S I GTERМ (или просто ТЕRМ). Сле
дует также иметь в виду, что в одной строке с командой k i 1 1 может быть указано
несколько идентификаторов процессов.
Пример ы:
kill -9 1234
k i l l - H U P '(, 2 3 4 5 6
k i l l - s T E RM '{, 2
kill 1
406 П р и п оже н и е д, Краткое и зложен ие оболочки
Команда newgrp
Общая форма: newgrp труппа
Эта команда заменяет настоящий иденти ф икатор группы (GID) указанной
труппой. Если она указана без аргументов, то происходит возврат к группе, ис
пользуемой по умолчанию.
Пример:
newgrp s hb o o k Заменить труппу на shЬook
newgrp Вернуть ся о бра тно к исполь зуемой
по умолча нию труппе
Команда read
Общая форма: r e a d переменные
Выполнение этой команды приводит к тому, что оболоч ка читает строку из
стандартного ввода и присваивает указанной переменной слова, разделяемые
пробелами далее в строке. Если в строке указано меньше переменных, чем слов,
дополнительные слова сохраняются в последней переменной.
Указание лишь одной переменной означает, что этой переменной присваива
ется прочитанная строка. Команда read возвращает нулевой код завершения,
если только не обнаруживается условие, обозначающее конец ф айла.
Пример :
$ read hours mins
10 1 9
$ echo " $hours : $mins "
10 : 19
С водка команд 407
Команда readonly
Общая форма: re adon l y переменные
Эта коман д а сообщает оболочке, что перечисленным в ней переменным
нельзя присваивать значения. Значения этим переменным могут быть дополни
тельно присвоены только в командной строке r e adon l y. Если же впоследствии
попытаться присвоить значение переменной, указанной в командной строке
readonl y, оболочка выдаст соответствующее сообщение об ошибке.
Переменные удобно устанавливать в коман д ной строке r e adon l y для того,
чтобы исключить неумышленную перезапись их значений. Этим также гаранти
руется, что другие пользователи программы оболочки не смогут изменить зна
чения отдельных перемен ных (например, переменных НОМЕ или РАТН). Атрибут
readon l y (только для чтения) не передается далее подоболочкам. Если команда
re adon l y указана с параметром -р, она вывод ит список переменных с атрибу
том reado n l y.
Пр1jмер ы :
$ readonly DB=/users /s teve/dataЬase Присв оить з на чение
переменной DВ и сдела ть
ее доступной толь ко
для чтения
$ DB=foo Попыта ть ся присв оить
зна чение переменной DB
sh : DB : i s read - on l y Сообщение о б ошибке ,
выв одимое о боло чкой
$ echo $DB Тем не менее ее зна чение
/ u s e r s / s teve / da t aba s e по -прежнему доступно
$
408 П р и л о ж е н и е А. Краткое изложен ие оболочки
Команда return
Общая форма: r e t u rn п
Выпол нение этой команды приводит к тому, что оболочка прерывает выпол
нение текущей функции и сразу же возвращает код завершения п вызывающей
части программы. Если же аргумент п опущен, то возвращается код завершения
команды, выполнявшейся непосредственно перед командой re turn.
В табл. А.9 сведены параметры, которые могут быть выбраны для установки
или сброса в команде s e t .
Табли ца А.9. Параметры, доступ ные дл я установки и л и сброса в команде set
Окончание табл. А . 9
Пара метр Наз начение
-
о m Включить режим установки параметров m (см. табл. А. 1 0 )
-и Выдать ошибку, если происходит обращение к переменной, которой еще не
было присвоено зна•1ение, или же обращение к неустановленному еще по
зиционному параметру
-v Вывести каждую командную строку по мере ее чтения в оболоч ке
-х Вывести каждую команду и ее аргументы по мере их выполнения, предварив
ее знаком +
Р еж и м Назначение
allexport То же, что и параметр - а
Примеры:
set - vx Выв ести в се кома ндные строки
по мере их чтения , а та кже
каждую кома нду и ее аргументы
по мере их выполнения
s e t " $ name " " $ addre s s " " $ phone " Уста новить параметр $1 в
переменной $пате , параметр
$2 в переменной $address ,
-
а параме тр $3 - в переменной
$phone
set -1 Уста новить в параметре $1
зна чение - 1
set -о vi Уста новить режим реда ктиров а ния
строк в реда кторе vi
s e t +о ve rbo s e - о n o g l ob Выключить многословный режим ,
в ключить режим nogl.oЬ
Команда tes t
Общая форма :
test условие
или
условие
i f test -х / e t c / pe rms
then
fi
if [ -d $ f i l e - о \ ( - f $ f i l e -а -r $ f i l e \ ) ]
then
fi
412 П ри л о же н и е А . Краткое изложен ие оболочки
Окончание табл. А . 1 1
Оп ера ц ия Воз вращает л о ги ч еское значение ТRUE,
т.е. нулевой код за вершен и я п р и услови и , что" .
Указанное целочисленное значение int1 больше задан
ного целочисленного значения int2
Указанное целочисленное значение int1 меньше или
равно заданному целочисленному значению in t2
Указанное целочисленное значение int1 меньше задан
ного целочисленного значения int2
Указанные целочисленные значения int1 и int2 не равны
ражение2
Ко ма нда times
Общая форма: t ime s
Выполнение этой команды приводит к тому, что оболочка направляет в стан
дартный вывод общее коли чество времени, использованного оболочкой и всеми
порожденными ею процессами. Для каждого из этих процессов выводятся два
числа: первое обозначает н акоплен ное пользователем время, а второе - время,
накоплен ное системой. Однако команда t ime s не сообщает время, использован
ное встроенными командами.
Пример:
$ times Выве сти время , использова нное проце с сами
lm5 s 2m9 s 1 минута , 5 секунд польз ов а тель ского
времени , 2 минуты, 9 секунд
системного времени
8m2 2 . 2 3 s 6m2 2 . 0 l s Время , исполь зова нное
порожденными проце с сами
$
Команда trap
Общая форма : t rap команды сигналы
Эта команда предп исывает оболочке выполн ить указанные кома нды всякий
раз, когда она получает один из переч исленных сигналов. Эти сигналы могут
быть указаны по имени или номеру.
414 П р и тюже н и е А . Краткое и зложен ие оболоч ки
Если команда t rap введена без аргументов, она выводит список назначенных
обработчиков прерываний. Если же в качестве первого аргумента указана пустая
строка, как следующем примере:
t rap " " сигналы
Оболочка просматри вает указанные кома нды, когда обнаружи вает команду
t r ap, и делает это снова при получени и одного из перечисленных сигналов. Это,
например, означает, что при обнаружении следующей команды:
t r ap " e cho $ co u n t l i n e s p ro c e s s e d > > $ LOGF I LE ; e x i t " HUP I NT ТЕRМ
Ко манда type
Общая форма: t уре кома нды
Эта команда выводит сведения об указанных кома нда х.
Примеры:
$ type troff echo
t r o f f i s / u s r / b i n / t ro f f
echo i s а s he l l b u i l t i n
$
Ко ма нда umask
Общая форма: uma s k ма ска
Эта команда устанавливает стандартную ма ску для создания файлов. Задан
ная маска накладывается н а создаваемые в дальнейшем файлы по логической
операции И, чтобы определить режим доступа к файлу. Если команда uma s k ука
зана без аргументов, она выводит текущую маску. А параметр - S предписывает
вывес_ти маску в символическом виде.
Примеры:
$ umask Выв е с ти текущую ма ску
0002 З а пре тить за пись в фа йл другим пользова телям
$ umask 022 З а прети т ь за пись в ф а йл в сем членам труппы
$
416 П р и л о же н и е А . К раткое изложен ие оболочки
Ко м а н да unset
Общая форма: un s e t имена
Выполнение этой команды приводит к стиранию определений переменных
или функций, перечисленных среди указанных имен. Переменные, доступные
только для чтения, не могут быть восстановлены в исходное состоя ние. Параметр
-v команды un s e t указывает на то, что далее следует имя переменной, тогда как
Ко м а нда u n til
Общая форма:
un t i l кома нда ,
do
кома нда
кома нда
done
Пример:
# ожидат ь по 60 се кунд до т е х пор , пока по л ь зователь
# j ack не войдет в с и с тему
unt i l who 1 g r e p j a c k > / d e v / n u l l
do
s l e ep 6 0
done
echo j a c k ha s l o gged on
В при веденном выше примере цикл unt i l продолжается до тех пор, пока ко
манда grep не возвратит нулевой код завершения (т.е. обнаружит имя пользова
теля j a c k в результате, выводимом командой who). В этот момент цикл unt i l
завершается и далее выполняется команда e cho.
Команда wai t
Общая форма : wa i t зада ние
Выполнение этой команды при водит к тому, что оболочка приостанавливает
свое выполнение до тех пор, пока не заверш ится процесс, который обозначает
указанное зада ние. Если же зада ние не указано, то оболочка ожидает заверше
ния всех порожденных процессов. А если указано несколько заданий, то команда
wa i t будет ожидать завершения всех этих заданий. Команда wa i t удобна в тех
случаях, когда требуется организовать ожидание завершения процессов, отправ
ленных на выполнение в фоновый режим. Для получения идентификатора по
следнего процесса, отправлен ного на выполнение в фоновый режим, можно вос
пользоваться перемен ной $ ! .
Пример:
s o r t l a rge f i l e > s o r t ed f i l e & Отсортиров а ть в фоновом режиме
Продолжить о бра бо тку
wa i t А теперь подожда ть за в ершения
сортиров ки
p l o t da t a s o r t e d f i l e
Команда whi le
Общая форма:
wh i l e кома нда ,
do
кома нда
команда
done
wh i l e [ $ l i ne s - l e $ma x l i n e s
do
echo > > $ B U FFER
l ines=$ ( ( l ines + 1 ) )
done
Дополн и тел ьн ые
и с т оч ни ки и нформ ац ии
О п е ра ти в н о до ступ н а я до ку м ен та ци я
Если документация на вашу систему недоступ на в печатном виде, воспользуй
тесь командой man, чтобы получить нужную и нформацию о конкретной команде
Unix из так называемых оперативных стр аниц руководства. Ниже приведена об
щая форма данной команды.
man кома нда
поможет вам выявить ее в системе Linux или Unix, как демонстрируется в следу
ющем примере из версии Ubuntu системы Linux:
$ man - k dvd
brasero (1) - S imp l e a n d e a s y t o u s e C D / DVD b u r n i n g
a pp l i ca t i o n f o r . . .
( Прос та я команда для за пи с и CD/DVD )
Ьtcflash (8) - f i rmw a r e f l a s h u t i l i t y f o r ВТС DRW 1 0 0 8
DVD+ / - RW r e c o r de r .
( Утилита для пропмвки в страива емого ПО
с помощью устройства за пи си В ТС DRW1 0 0 8
н а ди ски D VD + / - R W)
dvd+ rw-bo o k t ype (1) - fo rma t DV D+ - RW / - RAМ di s k w i t h
а l o g i c a l f o rma t
( Кома нда логического форма тирова ния
дисков DVD+ - RW/ - RAМ)
dvd+ rw - f o rma t (1) - f o rma t DVD+ - RW / - RAМ d i s k
( Кома нда форма тирова ния дисков
DVD+ - R W/ - RAМ)
dvd+ rw-me d i a i n f o (1) - d i s p l a y i n f o rma t i on abou t dvd
420 П р и л ож е н и Р Б. Доп ол н ител ьн ы е источ н и к и и нф ор мации
d r i ve and d i s k
( Кома нда для выв ода св едений о
на копителе и диска х DVD )
dvd - r am- con t r o l (1) - che c k s fea t u r e s o f DVD - RAM d i s c s
( Кома нда , пров еряюща я состояние
ДИСКОВ DVD-RAМ)
g rowi s o f s (1) - c omЬ i ne d g en i s o image f r o n t e n d / DVD
r e c o r d i n g p r o g r am .
( Утилита , объ единенна я с клиентской
пporpatvrМoй gen i s o iшa ge созда ния обра зов
и за писи дисков D VD )
rp l 8 (8) - Fi rmw a r e l o a de r f o r D V D d r i ve s
( За rруз чик в строенного ПО с дисков D VD )
$
Л ите ра ту ра
Ниже приведен перечень рекомендованной для чтения литературы по про
граммированию на языке оболочки в системах Unix.
имен файлов р
в командной строке, 67; 1 30 Регулярные выражения
механ измы, 4 1 в команде grep, описание, 1 09
специальные символы, 387 применение, 73
характерные примеры, 44 совпадение
команд с заданным количеством сим вощ>в, 79
вложенные, применение, 1 50 с концом строки, 76
применение, 1 48 с началом строки, укоренение слева, 75
способы, 1 45 с одиночным символом, 73
позицион ных параметров, порядок, 1 56 с точным количеством подшаблонов, 83
сложные, по шаблонам, 43 с шаблонами, 73
Предыстория команд сохранение совпавших символов, 85
в режиме редактора специальные символы, применение, 87; 1 92
emacs, доступ, 349 Редактирование строк
vi, доступ , 345 в редакторе
ведение, 342; 382 emacs, особенности, 347
доступ к командам, 346; 382 vi, режимы и команды, 343; 347; 382
другие способы доступа, 352 выбор режима, 342
Программы Редакторы
аdd, описание, 1 60; 266; 328 ed
addi, описание, 243 назначение, 74
align, описание, 2 5 1 примеры применения, 78
change, описание, 333 emacs
ctype, описание, 1 93 ; 1 96 доступ к командам из предыстории, 349
db, описание, 274 команды редактирования строк, 348; 35 1
display, описание, 329 sed
greetings, описание, 1 86; 1 9 7 назначение, 96
listall, описание, 3 3 4 примеры применения, 99
lu, описание, 1 58; 265; 266; 328 vi
mycp, описание, 227; 230; 232 команды редактирования строк, 344;
number, описание, 1 9 1 ; 1 92; 244 347
number2, описание, 300 режимы редактирования строк, 343
оп, описание, 1 67; 1 8 1
rem, описание, 1 6 1 ; 1 84; 1 88; 266; 33 1 с
reverse, описание, 364 Сигналы
rolo, описание, 236; 266; 323; 3 3 5 назначение, 307
run, описание, 206 наименования и номера, 307
shar, описание, 3 1 7 обработка, 307
waitfor, описание, 2 1 1 ; 2 1 5; 223; 278 сброс прерываний, 31 О
words, описание, 295; 297 указываемые в команде trap, 4 1 4
Процессы Символические ссылки
идентификаторы, получение и хране назначение, 38
ние, 306 висячие, определение, 39
родительские и порожденные, выполне Системы Unix
ние, 305 активизация терминала, процесс, 60
Псевдонимы командная строка как стандартный поль
назначение, 359 зовательский интерфейс, 1 7
определение, 359 команды как инструменты, 1 7
удаление, 362
П редметн ы й указател ь 427
Ричард Блум,
Кристина Бреснахэн
п р и м е 1 1 1 1 �1 ы х , :'>'/tо6 1 1 ы х 1· 1 1 с 1 1 а р 1 1 с н
;1:1я 0 1 1 1.пн 1.1 х 1 ю:1 1,:ю вате:1 с i i .
С l' l'O l lO M O l ! l l> K J ' l l lТ <IП'.'11•
б ы с т ро 1 юл у • 1 11 т 1ю: 1.\10ж 1 1 осп,
а вт1шат 1 1 : 1 1 1 р< > ва т 1 , <!1а кт 1 1 • 1 е с к 1 1
:ноuую :-1 а;щ • 1 у в п 1 сн· щ' l . i 1 н1 x .
www . d i a l e kt i k a . c o m
I S B N 978 - 5 - 8 4 5 9 - 1 7 80 - 5 в п родаже
LINUX
Карманный справочник
Второе издание
Скотт Граннеман
-
к р ат к и й с п р; ш о • 1 н и к 1 1 0
о с н о в н ы м ком а н да м о п е
"
НЕО&ХОДММЫИ МОД И МОМАНДЫ
р ;щ и о н ной с и стем ы (j 1ш х .
Н к н и 1·е содерж ится м но ж е с т в о
1·от о в ь1 х к ис п ол ьз о в а н и ю
Li n ux·
ф р а 1 · м е 1пов п ро г р а м м и ком анд
Д.'I Я ll Ы l l ОЛ Не н и я т и п и ч н ы х
:1ада•1 в с истеме Linнx.
K н и ril будет 1юлезю1 K il K
1 1 р1 1сту п а ю щ и х к изучен и ю
Uпux, так и для опытных
п о л 1. э о в ател е i i , п р и м е н я ю щ и х
оболоч к у /tл я р е ш е н ия разн ы х
эадач : от ад м 1 1 1 1 и ст р 11 р о ва н и я
itO п ро г р а м м и ро в а н и я .
www.williamspuЬlishing.com
КАРМАННЫИ СПРАВОЧНИК
ПЯТОЕ ИЗДАНИЕ
Марк Лутц
Э т о т к р ат к и й с 11 р а в о 1J 1 1 и к 1 1 0
удобс н д л я н а в е д е н и я
б ы ст р ы х с п ра в о к при
раэработке п рогра м м 11а
Python . R л а к 0 t 11 1 ч 11 о ii
форме :щс с ь 1 1 \) CJ(C T a B JI C H ЬI
в с е н е обход и м ы е с в t:·леш1 я
о т 11 1 1 а х да 1 1 1 1 ы х 11 операторах
Python , с п с ц и ал ы 1 ы х методах
перегрузки о п е р ат о р о в ,
встроен н ы х фу н к ц и я х
и и с к л ю •1 е 11 и я х , н а и б о л е е
у п от р е б и тел ьн ы х ста н д а рт н ы х
б и бл иотс•1 н ы х м одул я х
и д ру г и х примечател ьн ы х
я э ы ко н ы х с р едст в а х
Pvt\1011 . в том •шслс и дл я
о б ъ с к т 1 ю - о р и с 1 1 т 11 ро в а н 1 1 о т
www.williamspuЬlishing.com п ро гр а м м и ро в а н и я .
С п р а в о •1 1 1 и к р а с с • 1 и т а 1 1 l l <t
Ш ИJЮК lf Й кру г ' l l ПaTl'.!l l' ii ,
и 11 тс р с с у ю щ и хс я
п р о г р ;1 1\1 м 11 1ю в а 1 1 и е м на P y t l1 0 1 1 .
I S B N 9 7 8 - 5 - 8 4 5 9 - 1 9 1 2- 0 в п родаже
JAVASCRIPT
КАРМАН НЫЙ СПРА В ОЧНИК
3-Е ИЗДАН ИЕ
JavaScript п ра к т и ч е с к о го 1 1 р и м е н е 11 и я .
Н t> ою т р я 1 1 а м а л ы й о б ъ е м
к а р �1 а 1 1 1 ю го н :щ ан и я ,
Кар.мттыii справо чник в 1 1 (.' М С О/ll'\)Ж И Т С Я в с е , ч то
1 1 еобхол и м о :ш ап, дл я
разработ к и п ро ф е с с и о н а л ь н ы х
веб-п риложен и й .
I :'! а в ы 1-9 посвя щен ы
о п и с а н и ю с и н т а кс и с а
п оследней в е р с и и я з ы к а
(с п е ц иф и к а ц и я E C M A S cгipt 5 ) .
· Ти п ы дан н ы х , значения
и п е р е м е н н ые
O'REILLY' � )i.7f�/I() Ф'Ullfl?ШI · И н с т ру к ц и и о п е раторы
,
и u ы раже н и я
· О б ъ е к т ы и м ас с и в ы
www.williamspuЬlishing.com · Классы н фун к ц и н
· Ре 1·у:1 я р 11 ы с в ы р а ж е н и .и
В гл а в а х 1 0 - 1 /i
рас с м ат р и в а ю т е я
фу 1 1 к 1 ню 1 1 а л ы1 ы е в о : 1 м о ж 1 юс т и
я :i ы к а н а р я д у с м о;tе:� ь ю
f)()M И C j) l'J\C T B il M ll
1 1 од л е рж к н 1 IТ М 1. 5 .
I S B N 978 - 5 - 8 4 5 9 - 1 8 30 - 7 в п родаже
РНР и MySQL™
Карманны й справочник
Кристиан Уэнц
8
НЮ6ХОДММWЙ КОД И КОМАНДЫ
расс мотре н и я те м ы , с которы м и
.
Р Н Р - п рогра м м и ст стал к и ваетсн
п р а кт и ч е с к и е жедне в н о . Автор
РН Р и
п р и л ож и л м а к с и м у м ус ил и й ,
чтобы этот карман н ы й с п раrюч н и к
с оответство вал п ослед н и м
УЗНАЙТ Е КАК" .
• В ы годно п ользоваться м н о ги м и утилита м и , п редоста вля е м ы м и с и сте м о й U п i x
• П исать эффе кт и в н ы е сце н а р и и оболо ч к и
• И с п ользовать встрое н н ы е в оболоч ку кон струкц и и д л я в ы бора в а р и а нтов и о р га н и з а ц и и ц и клов
• П р и м е н ять эффе кти в н ы е м еха н и з м ы за ключ е н и я в ка в ы ч ки
• И з вле кать м а кс и м а льную пользу из встрое н н о й в оболоч ку п редысто р и и ко м а н д и с редств их
реда кти рова н и я
• П ользоваться регуля р н ы м и в ы ра же н и я м и в ком а ндах U п ix
• В ы годно пользо ваться с п е ци а л ь н ы м и с редства м и оболо ч е к Коrп и Bash
• В ы я влять о с н о в н ы е отл и ч и я в е р с и й я з ы ка оболо ч к и
• И з м е н ять п о рядок реа кци и с и сте м ы U п ix на дейст в и я пользо вателя
• Н а стра и вать с реду оболочки
• Пользо ваться фун к ци я м и
• Отлажи вать п рогра м м ы и с це н а р и и оболо ч к и
�.№д.ila<mUКtl
""
w w w .w i l l i a m s p u b l i s h i n g . c o m
..,. ..,.
Addison
Wesley 9 785990 944 5 3 4